[英]Laravel update password only if it is set
我正在使用用戶登錄進行 laravel 項目。 管理員可以創建新用戶和編輯現有用戶。 我在更新用戶表單中有一個password
和一個passwordConfirm
字段。 如果管理員在表單中輸入新密碼,它應該檢查驗證並更新數據庫中的記錄。 如果不是,則不應更改密碼(保留舊密碼),而應更新其他用戶數據(如名字)。
如果我嘗試發送帶有空password
和passwordConfirm
字段的表單,它不會驗證。 我得到一個驗證錯誤,密碼必須是一個字符串並且至少有 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
使用驗證規則。
sometimes
在password
和passwordConfirm
添加驗證。 從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,但是如果您的方法是PATCH或PUT,則意味着您無需驗證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.