Php Laravel FormRequest验证获取用户模型,有时直接获取名称

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

我正在使用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在用户提交表单以检查上传的图像是否有效之前被调用。我知道,我也可以在一个请求中执行此操作,但这是不可能的,因为我正在使用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
路由的控制器方法在哪里?您是否忘记在该控制器方法中键入hint
User$User
?为什么标记为Symfony?您能否显示
update()
validAvatar()的参数?它可能由参数触发。您是指功能参数还是路线参数?另外,如果这有帮助的话:我现在已经把这两个请求分开了,但我面临着同样的问题。我的验证和更新功能有自己的FormRequest文件,但我仍然有相同的错误。。。但是由于分离,实际上已经不能再触发了…我不明白你为什么要进行这种手动验证。当用户通过身份验证时,他应该只能更新Auth::user()->avatar(),因此只能更新其自己的化身。另外,为什么要使用“name”而不是“ids”或“uuids”,这样可以防止字符或空格问题?您是否在这两种情况下都尝试转储“^request->all()”以检查问题是否来自提交的帖子数据?此
用户.avatar.valid
路由的控制器方法在哪里?您是否忘记在该控制器方法中键入提示
User$User
?对不起。。。我不知道你在说什么。您指的是文档的哪一部分?我应该将此功能放置在哪里?这是您对
用户.avatar.valid
方法的操作。。。仅显示您尝试使用的模型绑定的类型提示,按照您的routesGotcha。但是我必须将
有效的
函数放在哪里?或者你的意思是这是我的
功能
来验证化身?这是你的路线
用户的控制器方法.avatar.valid
UserController@validAvatar
。。。我的名字错了对不起。。。我