Php Laravel FormRequest验证获取用户模型,有时直接获取名称
我正在使用Laravel 8并使用验证我的请求。然而,我有一个奇怪的问题。在描述我的问题之前,我将把我的路线和验证类粘贴到这里: 路线:Php Laravel FormRequest验证获取用户模型,有时直接获取名称,php,laravel,validation,laravel-formrequest,Php,Laravel,Validation,Laravel Formrequest,我正在使用Laravel 8并使用验证我的请求。然而,我有一个奇怪的问题。在描述我的问题之前,我将把我的路线和验证类粘贴到这里: 路线: Route::post('users', ['as' => 'user.search', 'uses' => 'UserController@indexSearch']); Route::post('user/name', ['as' => 'user.name.exists', 'uses' => 'UserController@n
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
验证类。基本上,user.avatar.valid在用户提交表单以检查上传的图像是否有效之前被调用。我知道,我也可以在一个请求中执行此操作,但这是不可能的,因为我正在使用Vuejs的vee validate
来验证表单是否有效
然而,这不是问题所在。问题是,当调用user.avatar.valid
route my dump时,请求的密钥会回显请求用户的名称。但是,当执行对user.avatar.update
的请求时,我不会得到用户的名称,而是得到包含id
、name
、email
等的用户对象
但正是这一点。。。当试图调用user.avatar.update
时,我得到一个403
错误(禁止),因为$this->user
不等于Auth::user()->name
。显然,当我将字符串
(名称)与用户对象
进行比较时,情况不同
但是,当调用user.avatar.valid
时,它会通过,因为在这里我在调用$this->user
时得到的是名称
,而不是用户对象
但为什么呢
当我将$this->user
更改为$this->user->name
时,我会在调用user.avatar.update
路由时获取用户的实际名称,但在另一边,我在调用user.avatar.valid
路由时会出现500
错误,因为它说试图获取非对象
有没有人知道问题出在哪里以及如何解决
亲切的问候和感谢 确保您在控制器的方法签名中正确地为路由模型绑定类型提示属性。如果没有,您将只获取段的值,即用户的名称,而不是用户模型,因为隐式模型绑定不会发生:
public function validAvatar(User $user) { ... }
确保您在控制器的方法签名中正确地为路由模型绑定键入提示属性。如果没有,您将只获取段的值,即用户的名称,而不是用户模型,因为隐式模型绑定不会发生:
public function validAvatar(User $user) { ... }
为什么标记为Symfony?能否显示update()
和validAvatar()
的参数?它可能由参数触发。您是指功能参数还是路线参数?另外,如果这有帮助的话:我现在已经把这两个请求分开了,但我面临着同样的问题。我的验证和更新功能有自己的FormRequest文件,但我仍然有相同的错误。。。但是由于分离,实际上已经不能再触发了…我不明白你为什么要进行这种手动验证。当用户通过身份验证时,他应该只能更新Auth::user()->avatar(),因此只能更新其自己的化身。另外,为什么要使用“name”而不是“ids”或“uuids”,这样可以防止字符或空格问题?您是否在这两种情况下都尝试转储“^request->all()”以检查问题是否来自提交的帖子数据?此用户.avatar.valid
路由的控制器方法在哪里?您是否忘记在该控制器方法中键入hintUser$User
?为什么标记为Symfony?您能否显示update()
和validAvatar()的参数?它可能由参数触发。您是指功能参数还是路线参数?另外,如果这有帮助的话:我现在已经把这两个请求分开了,但我面临着同样的问题。我的验证和更新功能有自己的FormRequest文件,但我仍然有相同的错误。。。但是由于分离,实际上已经不能再触发了…我不明白你为什么要进行这种手动验证。当用户通过身份验证时,他应该只能更新Auth::user()->avatar(),因此只能更新其自己的化身。另外,为什么要使用“name”而不是“ids”或“uuids”,这样可以防止字符或空格问题?您是否在这两种情况下都尝试转储“^request->all()”以检查问题是否来自提交的帖子数据?此用户.avatar.valid
路由的控制器方法在哪里?您是否忘记在该控制器方法中键入提示User$User
?对不起。。。我不知道你在说什么。您指的是文档的哪一部分?我应该将此功能放置在哪里?这是您对用户.avatar.valid
方法的操作。。。仅显示您尝试使用的模型绑定的类型提示,按照您的routesGotcha。但是我必须将有效的函数放在哪里?或者你的意思是这是我的功能
来验证化身?这是你的路线用户的控制器方法.avatar.valid
UserController@validAvatar
。。。我的名字错了对不起。。。我