我正在使用 Laravel 8 并使用表单请求验证来验证我的请求。但是,我有一个奇怪的问题。在描述我的问题之前,我将在此处粘贴我的路线和验证类:
路线:
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
在用户提交表单之前被调用以检查上传的图像是否有效。我知道,我也可以在一个请求中执行此操作,但这是不可能的,因为我正在使用vee-validate
Vuejs 来验证表单是否有效。
但是,这不是这里的问题。问题是,在调用user.avatar.valid
路由时,我的转储会回显所请求用户的requested
密钥name
。但是,在执行请求时,user.avatar.update
我没有得到name
用户的 ,而是object
包含id
、name
等的用户email
。
但这正是重点......当我试图打电话时,user.avatar.update
我得到一个403
错误(禁止),因为$this->user
不等于Auth::user()->name
. 显然,当我将 a string
(name) 与 user进行比较时,它是不一样的object
。
但是,调用user.avatar.valid
它时会通过,因为在这里我得到的是name
when calling$this->user
而不是 user object
。
但这是为什么呢?
当我更改为时$this->user
,$this->user->name
我在调用路由时获得了用户的实际名称,user.avatar.update
但另一方面,500
在调用路由时出现错误,user.avatar.valid
因为它说Trying to get property 'name' of non-object
...
有谁知道这里的问题出在哪里以及如何解决这个问题?
亲切的问候,谢谢!