在 Laravel 中包含自定义表单请求会阻止控制器正常工作
Including a custom form request in Laravel prevents the controller from working correct
描述
我有一个 user/role 管理系统,希望管理员能够更改用户的密码和名称。
到目前为止,它在 UsersController
:
中使用此代码
public function update(request $request, User $user)
{
// dd($request);
//Save roles
$user->roles()->sync($request->roles);
//Save user
$user->name = $request->input("name");
if ($request->input('password')) {
$user->password = Hash::make($request->input('password'));
}
$user->save();
return redirect()->route("admin.users.index");
}
我使用此命令 php artisan make:request UpdateUser
创建了一个名为 UpdateUser
的表单请求,并使用 use App\Http\Requests\UpdateUser;
将其放入 UsersController
并将 public function update(request $request, User $user)...
更改为 public function update(UpdateUser $request, User $user)...
(我从 this site 那里得到了这方面的教程)
UpdateUser
看起来像这样,基本功能应该是验证密码输入和密码确认输入是否匹配。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateUser extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => ['string', 'max:255', "unique:users"],
'password' => ["nullable", 'string', 'min:6', 'confirmed'],
'roles' => ['exists:roles,id'],
];
}
}
问题
没有 UpdateUser
就可以了。我可以更改名称、密码和角色。
但是 UpdateUser
我只能更改名称。无法更改角色或密码。当我尝试更改角色 and/or 密码并提交时,只会重新加载编辑页面。
那么这可能是什么原因呢?
你可以找到我的整个 repo here
改用$request->input('password')
。
我建议您也对所有请求数据使用 ->input
方法。
当您使用自定义请求时,您应该使用 $request->password
而不是 $request['password']
。这是我看到的第一件事。
事实证明,在大多数情况下,这是用户的错误;)
所以发生了什么?
在编辑中 blade 我从用户加载名称,我想编辑。
{{Form::text("name", $user->name, ["class" => "edit-input", "placeholder" => "Neuer Name..."])}}
当我只更改了角色或密码 而没有 更改名称时,UpdateUser
声称用户已经存在。这是来自 UpdateUser
的相应代码行:
public function rules()
{
return [
'name' => ['string', 'max:255', "unique:users"],
'password' => ["nullable", 'string', 'min:6', 'confirmed'],
'roles' => ['exists:roles,id'],
];
}
}
unique:users
要求导致编辑页面的简单重新加载,因为该名称显然已经存在。
我现在明白了,因为我实现了显示 error/success 通知。
在编辑 blade 中,我只是将 $user->name
替换为 ""
。
描述
我有一个 user/role 管理系统,希望管理员能够更改用户的密码和名称。
到目前为止,它在 UsersController
:
public function update(request $request, User $user)
{
// dd($request);
//Save roles
$user->roles()->sync($request->roles);
//Save user
$user->name = $request->input("name");
if ($request->input('password')) {
$user->password = Hash::make($request->input('password'));
}
$user->save();
return redirect()->route("admin.users.index");
}
我使用此命令 php artisan make:request UpdateUser
创建了一个名为 UpdateUser
的表单请求,并使用 use App\Http\Requests\UpdateUser;
将其放入 UsersController
并将 public function update(request $request, User $user)...
更改为 public function update(UpdateUser $request, User $user)...
(我从 this site 那里得到了这方面的教程)
UpdateUser
看起来像这样,基本功能应该是验证密码输入和密码确认输入是否匹配。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateUser extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => ['string', 'max:255', "unique:users"],
'password' => ["nullable", 'string', 'min:6', 'confirmed'],
'roles' => ['exists:roles,id'],
];
}
}
问题
没有 UpdateUser
就可以了。我可以更改名称、密码和角色。
但是 UpdateUser
我只能更改名称。无法更改角色或密码。当我尝试更改角色 and/or 密码并提交时,只会重新加载编辑页面。
那么这可能是什么原因呢?
你可以找到我的整个 repo here
改用$request->input('password')
。
我建议您也对所有请求数据使用 ->input
方法。
当您使用自定义请求时,您应该使用 $request->password
而不是 $request['password']
。这是我看到的第一件事。
事实证明,在大多数情况下,这是用户的错误;)
所以发生了什么?
在编辑中 blade 我从用户加载名称,我想编辑。
{{Form::text("name", $user->name, ["class" => "edit-input", "placeholder" => "Neuer Name..."])}}
当我只更改了角色或密码 而没有 更改名称时,UpdateUser
声称用户已经存在。这是来自 UpdateUser
的相应代码行:
public function rules()
{
return [
'name' => ['string', 'max:255', "unique:users"],
'password' => ["nullable", 'string', 'min:6', 'confirmed'],
'roles' => ['exists:roles,id'],
];
}
}
unique:users
要求导致编辑页面的简单重新加载,因为该名称显然已经存在。
我现在明白了,因为我实现了显示 error/success 通知。
在编辑 blade 中,我只是将 $user->name
替换为 ""
。