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.validuser.avatar.update 都使用我在上面粘贴的 FormRequest 验证 class。基本上 user.avatar.valid 在用户提交表单之前被调用以检查上传的图像是否有效。我知道,我也可以在一个请求中执行此操作,但这是不可能的,因为我正在使用 vee-validate for Vuejs 来验证表单是否有效。

然而,这不是这里的问题。问题是,当调用 user.avatar.valid 路由时,我的转储回显了所请求用户的键 requestedname。但是,在执行对 user.avatar.update 的请求时,我没有得到用户的 name,而是包含 idname 的用户 objectemail 等等。

但这正是重点...当尝试调用 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