将参数传递给Laravel中间件

时间:2015-12-19 00:17:22

标签: php laravel-5

构建博客平台,我的目标是阻止用户直接访问允许他们在不同用户下发布的任何页面。

例如,他们创建了一个博客'Blog 1'

如果其他用户要向该博客添加新帖子:

/blog/newupdate/1

然后我想阻止它。

我已经为我的用户设置了方法,因为我在视图中检查了它,但需要一种方法来阻止此访问。

我在一个组中设置了一个中间件:

Route::group(['middleware' => 'auth','OwnsProject'], function () {
    Route::get('/project/newupdate/{id}',[
        'as' => 'project/newupdate',
        'uses' => 'ProjectController@createUpdate'
    ]);
});

在我想做的中间件中:

public function handle($request, Closure $next)
{
    if (!Auth::user()->ownsProject($id)) {
        // nada
    }
    return $next($request);
}

但请求中似乎没有出现任何内容?

2 个答案:

答案 0 :(得分:0)

只需在请求对象上使用route方法。

$id = $request->route('id');

答案 1 :(得分:0)

您的 OwnsProject 中间件未应用于您的路线。如果您使用的是2个或更多中间件,则必须以数组形式传递它们:

Route::group([ 'middleware' => ['auth','OwnsProject'] ], function () {
    Route::get('/project/newupdate/{id}',[
        'as' => 'project/newupdate',
        'uses' => 'ProjectController@createUpdate'
    ]);
});

正如Vishal的回答中提到的那样,这将为您返回“id”的价值。在你的中间件中。

$id = $request->route()->getParameter('id');

所以你应该在中间件中做这样的事情

public function handle($request, Closure $next)
{
    $id = $request->route()->getParameter('id');

    if ( !( \Auth::user()->ownsProject($id) ) ) {
        return redirect('/'); // Or anything else you want
    }
    return $next($request);
}