簡體   English   中英

Laravel 僅在設置時更新密碼

[英]Laravel update password only if it is set

我正在使用用戶登錄進行 laravel 項目。 管理員可以創建新用戶和編輯現有用戶。 我在更新用戶表單中有一個password和一個passwordConfirm字段。 如果管理員在表單中輸入新密碼,它應該檢查驗證並更新數據庫中的記錄。 如果不是,則不應更改密碼(保留舊密碼),而應更新其他用戶數據(如名字)。

如果我嘗試發送帶有空passwordpasswordConfirm字段的表單,它不會驗證。 我得到一個驗證錯誤,密碼必須是一個字符串並且至少有 6 個字符長,但我不知道為什么。 似乎我的更新 function 的第一行將被忽略。

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',
    ];
}

如果僅在字段存在時才想對其進行驗證,則在這種情況下sometimes使用驗證規則。

sometimespasswordpasswordConfirm添加驗證。 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

我總是在我的項目中這樣做:

//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,但是如果您的方法是PATCHPUT,則意味着您無需驗證password和passwordConfirm 。

希望能幫助到你

也許您應該嘗試以下操作:

// ... 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

也許你應該試試這個:

在您的請求中:

public function rules()
    {
        return [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'email', 'string', 'max:255', Rule::unique('users')->ignore(Auth::user())],
            'password' => ['sometimes', 'required_with:old_password', 'string', 'confirmed', 'min:8'],
        ];
    }

在您的控制器中:

public function update(ProfileUpdateRequest $request)
    {
        $data = $request->only('name', 'email');
        if ($request->password)
            $data['password'] = Hash::make($request->get('password'));
        $request->user()->update($data);


        return redirect()->back()->with('success', 'Profile updated.');
    }

您應該在代碼中將“has”替換為“filled”

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

實際上,如果你使用這樣的表達式會更好

    $request->request->remove('password_confirmation');
    ( ! $request->filled('password') ) ? $request->request->remove('password'):"";
    ( $request->has('password') ) ? $request->merge([ 'password' => Hash::make($request->post()['password']) ]):"";
    //then you can use 
    $user->update($request->all());

但是,更好的是,您必須使用單獨的請求類來創建和更新“php artisan make:request”,例如:UserUpdateRequest.php 和 UserCreateRequest.php

對於 UserCreateRequest 你的規則是

'password' => 'required|confirmed|min:6',

對於 UserUpdateRequest 你的規則是

'password' => 'sometimes|nullable|confirmed|min:6',

和你的 controller 頭添加這一行

use App\Http\Requests\UserCreateRequest;
use App\Http\Requests\UserUpdateRequest;

並且您的更新方法必須更改

public function update(UserUpdateRequest $request, $id)
    {
     //
}

這樣做的標准方法

UserRequest.php

先導入規則

use Illuminate\Validation\Rule;

在你的規則數組中:

'password' => [Rule::requiredIf(fn () => $this->route()->method == "POST")]

例子:

public function rules()
{
    return [
        'name' => 'required',
        'email' => ['required', 'email'],
        'password' => [Rule::requiredIf(fn () => $this->route()->method == "POST"), 'confirmed'],
    ];
}

下面php 7.4這樣使用

'password' => [Rule::requiredIf(function(){
   return $this->route()->method == "POST";
 })]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM