0

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

但是,这不是这里的问题。问题是,在调用user.avatar.valid路由时,我的转储会回显所请求用户的requested密钥name。但是,在执行请求时,user.avatar.update我没有得到name用户的 ,而是object包含idname等的用户email

但这正是重点......当我试图打电话时,user.avatar.update我得到一个403错误(禁止),因为$this->user不等于Auth::user()->name. 显然,当我将 a string(name) 与 user进行比较时,它是不一样的object

但是,调用user.avatar.valid它时会通过,因为在这里我得到的是namewhen 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...

有谁知道这里的问题出在哪里以及如何解决这个问题?

亲切的问候,谢谢!

4

1 回答 1

2

确保您在控制器的方法签名中正确地为路由模型绑定键入属性。如果没有,您将只获得段的值,用户的名称,而不是 User 模型,因为不会发生隐式模型绑定:

public function validAvatar(User $user) { ... }

Laravel 8.x 文档 - 路由 - 路由模型绑定 - 隐式绑定

于 2020-11-19T12:07:19.650 回答