将参数传递到Laravel中间件中


Passing a parameter into Laravel middleware

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

例如,他们创建了一个博客"博客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);
}

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

您可以使用请求对象作为访问id参数

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

然后是你剩下的代码:

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

您的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);
}

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

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