Laravel FormRequest 验证获取用户模型,有时直接获取名称
Laravel FormRequest validation gets User model and sometimes directly the name
我正在使用 Laravel 8 并使用 form request validation 验证我的请求。但是,我有一个奇怪的问题。在描述我的问题之前,我将在此处粘贴我的路线和验证 class:
路线:
Route::post('users', ['as' => 'user.search', 'uses' => 'UserController@indexSearch']);
Route::post('user/name', ['as' => 'user.name.exists', 'uses' => 'UserController@nameExists']);
Route::post('user/email', ['as' => 'user.email.exists', 'uses' => 'UserController@emailExists']);
Route::post('user/email/check', ['as' => 'user.email.check', 'uses' => 'UserController@emailCheck']);
Route::get('user/{user:name}', ['as' => 'user.show', 'uses' => 'UserController@show']);
Route::get('user/{user:name}/einstellungen', ['as' => 'user.settings', 'uses' => 'UserController@showSettings']);
Route::get('user/{user:name}/produkte', ['as' => 'user.products', 'uses' => 'UserController@userProducts']);
Route::post('user/{user:name}/produkte', ['as' => 'user.products.post', 'uses' => 'UserController@userProducts']);
Route::get('user/{user:name}/saved/produkte', ['as' => 'user.marked.products', 'uses' => 'UserController@userMarkedProducts']);
Route::post('user/{user:name}/saved/produkte', ['as' => 'user.marked.products.post', 'uses' => 'UserController@userMarkedProducts']);
Route::post('user/{user:name}/avatar/upload', ['as' => 'user.avatar.update', 'uses' => 'UserController@update']);
Route::post('user/{user:name}/avatar/valid', ['as' => 'user.avatar.valid', 'uses' => 'UserController@validAvatar']);
Route::post('user/{user:name}/avatar/löschen', ['as' => 'user.avatar.delete', 'uses' => 'UserController@deleteAvatar']);
Route::post('user/{user:name}/update/password', ['as' => 'user.password.change', 'uses' => 'UserController@updatePassword']);
Route::post('user/{user:name}/validate/password', ['as' => 'user.password.validate', 'uses' => 'UserController@validatePassword']);
这是我的 FormRequest
验证,它检查用户是否有权执行此请求以及给定的数据是否有效。如您所见,我检查 Auth::user()->name
是否与请求的用户 ($this->user->name
) 相同以更改图像。因为只有他个人资料图片的所有者才能更改个人资料图片。
class UserAvatarUpdateRequest extends FormRequest
{
public function authorize()
{
dump(array('auth' => Auth::user()->name, 'requested' => $this->user));
if(Auth::check() && Auth::user()->name == $this->user->name){
return true;
}
return false;
}
public function rules()
{
return [
'avatar' => [
'required',
'image',
'max:5000',
'mimes:jpeg,png,jpg',
Rule::dimensions()->minWidth(200)->minHeight(200)->ratio(1)
],
];
}
}
下面我来说说问题。如您所见,我为我的用户设置了多条路线,其中一条路线名为 user.avatar.valid
,另一条路线名为 user.avatar.update
.
两条路线,user.avatar.valid
和 user.avatar.update
都使用我在上面粘贴的 FormRequest
验证 class。基本上 user.avatar.valid
在用户提交表单之前被调用以检查上传的图像是否有效。我知道,我也可以在一个请求中执行此操作,但这是不可能的,因为我正在使用 vee-validate
for Vuejs 来验证表单是否有效。
然而,这不是这里的问题。问题是,当调用 user.avatar.valid
路由时,我的转储回显了所请求用户的键 requested
和 name
。但是,在执行对 user.avatar.update
的请求时,我没有得到用户的 name
,而是包含 id
、name
的用户 object
, email
等等。
但这正是重点...当尝试调用 user.avatar.update
时,我收到 403
错误(禁止),因为 $this->user
不等于 Auth::user()->name
.显然,当我将 string
(名称)与用户 object
.
进行比较时,它是不一样的
但是,当调用 user.avatar.valid
时它通过了,因为这里我在调用 $this->user
时得到了 name
而不是用户 object
.
但这是为什么呢?
当我将 $this->user
更改为 $this->user->name
时,我在调用 user.avatar.update
路由时得到了用户的实际名称,但在另一端我得到了 500
错误当调用 user.avatar.valid
路线时,因为它说 Trying to get property 'name' of non-object
...
有人知道这里的问题出在哪里以及如何解决吗?
谨致问候,谢谢!
确保您在控制器的方法签名中为路由模型绑定正确输入了 属性。如果不是,您将只获取段的值、用户名,而不是用户模型,因为隐式模型绑定不会发生:
public function validAvatar(User $user) { ... }
Laravel 8.x Docs - Routing - Route Model Bindings - Implicit Binding
我正在使用 Laravel 8 并使用 form request validation 验证我的请求。但是,我有一个奇怪的问题。在描述我的问题之前,我将在此处粘贴我的路线和验证 class:
路线:
Route::post('users', ['as' => 'user.search', 'uses' => 'UserController@indexSearch']);
Route::post('user/name', ['as' => 'user.name.exists', 'uses' => 'UserController@nameExists']);
Route::post('user/email', ['as' => 'user.email.exists', 'uses' => 'UserController@emailExists']);
Route::post('user/email/check', ['as' => 'user.email.check', 'uses' => 'UserController@emailCheck']);
Route::get('user/{user:name}', ['as' => 'user.show', 'uses' => 'UserController@show']);
Route::get('user/{user:name}/einstellungen', ['as' => 'user.settings', 'uses' => 'UserController@showSettings']);
Route::get('user/{user:name}/produkte', ['as' => 'user.products', 'uses' => 'UserController@userProducts']);
Route::post('user/{user:name}/produkte', ['as' => 'user.products.post', 'uses' => 'UserController@userProducts']);
Route::get('user/{user:name}/saved/produkte', ['as' => 'user.marked.products', 'uses' => 'UserController@userMarkedProducts']);
Route::post('user/{user:name}/saved/produkte', ['as' => 'user.marked.products.post', 'uses' => 'UserController@userMarkedProducts']);
Route::post('user/{user:name}/avatar/upload', ['as' => 'user.avatar.update', 'uses' => 'UserController@update']);
Route::post('user/{user:name}/avatar/valid', ['as' => 'user.avatar.valid', 'uses' => 'UserController@validAvatar']);
Route::post('user/{user:name}/avatar/löschen', ['as' => 'user.avatar.delete', 'uses' => 'UserController@deleteAvatar']);
Route::post('user/{user:name}/update/password', ['as' => 'user.password.change', 'uses' => 'UserController@updatePassword']);
Route::post('user/{user:name}/validate/password', ['as' => 'user.password.validate', 'uses' => 'UserController@validatePassword']);
这是我的 FormRequest
验证,它检查用户是否有权执行此请求以及给定的数据是否有效。如您所见,我检查 Auth::user()->name
是否与请求的用户 ($this->user->name
) 相同以更改图像。因为只有他个人资料图片的所有者才能更改个人资料图片。
class UserAvatarUpdateRequest extends FormRequest
{
public function authorize()
{
dump(array('auth' => Auth::user()->name, 'requested' => $this->user));
if(Auth::check() && Auth::user()->name == $this->user->name){
return true;
}
return false;
}
public function rules()
{
return [
'avatar' => [
'required',
'image',
'max:5000',
'mimes:jpeg,png,jpg',
Rule::dimensions()->minWidth(200)->minHeight(200)->ratio(1)
],
];
}
}
下面我来说说问题。如您所见,我为我的用户设置了多条路线,其中一条路线名为 user.avatar.valid
,另一条路线名为 user.avatar.update
.
两条路线,user.avatar.valid
和 user.avatar.update
都使用我在上面粘贴的 FormRequest
验证 class。基本上 user.avatar.valid
在用户提交表单之前被调用以检查上传的图像是否有效。我知道,我也可以在一个请求中执行此操作,但这是不可能的,因为我正在使用 vee-validate
for Vuejs 来验证表单是否有效。
然而,这不是这里的问题。问题是,当调用 user.avatar.valid
路由时,我的转储回显了所请求用户的键 requested
和 name
。但是,在执行对 user.avatar.update
的请求时,我没有得到用户的 name
,而是包含 id
、name
的用户 object
, email
等等。
但这正是重点...当尝试调用 user.avatar.update
时,我收到 403
错误(禁止),因为 $this->user
不等于 Auth::user()->name
.显然,当我将 string
(名称)与用户 object
.
但是,当调用 user.avatar.valid
时它通过了,因为这里我在调用 $this->user
时得到了 name
而不是用户 object
.
但这是为什么呢?
当我将 $this->user
更改为 $this->user->name
时,我在调用 user.avatar.update
路由时得到了用户的实际名称,但在另一端我得到了 500
错误当调用 user.avatar.valid
路线时,因为它说 Trying to get property 'name' of non-object
...
有人知道这里的问题出在哪里以及如何解决吗?
谨致问候,谢谢!
确保您在控制器的方法签名中为路由模型绑定正确输入了 属性。如果不是,您将只获取段的值、用户名,而不是用户模型,因为隐式模型绑定不会发生:
public function validAvatar(User $user) { ... }
Laravel 8.x Docs - Routing - Route Model Bindings - Implicit Binding