【问题标题】:Laravel update password only if it is setLaravel 仅在设置时更新密码
【发布时间】:2017-12-28 09:23:30
【问题描述】:

我正在使用用户登录的 laravel 项目。管理员可以创建新用户和编辑现有用户。我在更新用户表单中有一个password 和一个passwordConfirm 字段。如果管理员在表单中输入新密码,它应该检查验证并更新数据库中的记录。如果没有,它不应该更改密码(保留旧密码),而是更新其他用户数据(如名字)。

如果我尝试发送带有空 passwordpasswordConfirm 字段的表单,它不会验证。我收到一个验证错误,密码必须是一个字符串,并且长度至少为 6 个字符,但我不知道为什么。我的更新函数的第一行似乎将被忽略。

UserController.php

public function update(User $user, UserRequest $request) {

    $data = $request->has('password') ? $request->all() : $request->except(['password', 'passwordConfirm']);

    $user->update($data);

    return redirect('/users');
}

UserRequest.php

public function rules() {
    return [
        'firstname' => 'required|string|max:255',
        'lastname' => 'required|string|max:255',
        'email' => 'required|string|email|max:255',
        'password' => 'string|min:6',
        'passwordConfirm' => 'required_with:password|same:password',
    ];
}

【问题讨论】:

    标签: php laravel validation


    【解决方案1】:

    也许您应该尝试以下方法:

    // ... more code
    
    // Removes password field if it's null
    if (!$request->password) {
        unset($request['password']);
    }
    
     $request->validate([
        // ... other fields,
        'password' => 'sometimes|min:6'
        // ... other fields,
    ]);
    
    // ... more code
    

    【讨论】:

      【解决方案2】:

      我总是在我的项目中这样做:

      //Your UserController file
      public function update(User $user, UserRequest $request) {
      
          $user->update($request->all());
      
          return redirect('/users');
      }
      
      //Your UserRequest file
      
      public function rules() {
      $rules= [
          'firstname' => 'required|string|max:255',
          'lastname' => 'required|string|max:255',
          'email' => 'required|string|email|max:255'
      ];
      
        if($this->method()=="POST"){
         $rules['password']='sometimes|required|string|min:6';
        $rules['passwordConfirm']='sometimes|required_with:password|same:password';
        }
       return $rules;
      } 
      

      所以,你可以看到你的方法是否是 POST 这意味着你想添加一个新用户,所以它会要求输入密码和 passwordConfirm 但如果你的方法是 PATCH 或 PUT 表示您不需要验证密码和密码确认。

      希望对你有帮助

      【讨论】:

      • 这是一个很好的答案。但它有一个小漏洞!如果方法是 PUT(这意味着用户想要更新)并且新密码与确认不匹配或少于 6 个字符等怎么办?您还必须检查 PUT 方法的这些约束。
      【解决方案3】:

      如果您只想在字段存在时对其进行验证,则在这种情况下使用sometimes 验证规则。

      sometimes 验证添加到passwordpasswordConfirm。从update() 中删除$data 行;

      // UserController.php
      
      public function update(User $user, UserRequest $request) {
      
          $user->update($request->all());
      
          return redirect('/users');
      }
      
      // UserRequest.php
      public function rules() {
          return [
              'firstname' => 'required|string|max:255',
              'lastname' => 'required|string|max:255',
              'email' => 'required|string|email|max:255',
              'password' => 'sometimes|required|string|min:6',
              'passwordConfirm' => 'sometimes|required_with:password|same:password',
          ];
      }
      

      参考 - https://laravel.com/docs/5.4/validation#conditionally-adding-rules

      【讨论】:

      • 它不起作用。在发送带有空 password 和空 passwordConfirm 字段的表单后,我收到了一个错误,提示 password 字段是必需的。
      • @Pengxer 从password 中删除required 然后检查。
      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2018-01-04
      相关资源
      最近更新 更多