Laravel路由策略:函数1的参数太少,传递了2

时间:2019-09-29 03:23:56

标签: php laravel laravel-6 policies

我创建了一个策略来保护我的模型。我想做的是阻止任何人编辑不存在的想法记录。

web.php

Auth::routes();

Route::prefix('/')->middleware(['auth','can:viewAny,App\ThoughtRecord'])->group(function() {

    Route::get('/record/{id}/edit', 'ThoughtRecordController@edit')->middleware('can:isOwner,App\ThoughtRecord');

    Route::patch('/record/{thoughtRecord}','ThoughtRecordController@update')->middleware('can:isOwner,App\ThoughtRecord');

});

ThoughtRecordPolicy.php

public function isOwner(User $user, ThoughtRecord $thoughtRecord)
{
    return $user->id == $thoughtRecord->user_id;

}

->middleware(['auth','can:viewAny,App\ThoughtRecord'])可以正常工作。其他路由上的中间件没有经过->middleware('can:isOwner,App\ThoughtRecord')并产生此错误:

错误

  

Symfony \ Component \ Debug \ Exception \ FatalThrowableError   函数App \ Policies \ ThoughtRecordPolicy :: isOwner()的参数太少,在/Applications/MAMP/htdocs/thought-records/vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php中传递了1恰好是2个

编辑:

我将路线更改为:

Route::get('/record/{thoughtRecord}/edit', 'ThoughtRecordController@edit')->middleware('can:isOwner,thoughtRecord');

现在我得到403的条件是我相当肯定。

1 个答案:

答案 0 :(得分:1)

您错误地将第二个参数传递给isOwner策略的方法。

以下方法应该起作用:

Route::get('/record/{thoughtRecord}/edit', 'ThoughtRecordController@edit')->middleware('can:isOwner,thoughtRecord');

按照Demo on 3v4l.org

  

在此示例中,我们传递了can中间件两个参数。第一个是我们希望授权的操作的名称,第二个是我们希望传递给策略方法的route参数。在这种情况下,由于我们使用的是隐式模型绑定,因此Post模型将传递给policy方法。

因此,您基本上需要使用隐式模型绑定,并将route参数作为第二个参数传递。

希望有帮助!