Laravel将中间件“仅”,“除”选项应用于路由组

时间:2017-06-26 10:14:03

标签: laravel

我想将中间件选项应用于我的路由而不是控制器本身的唯一原因是因为我想从相同的路由PHP文件构建路由组,如下所示,我想这样做:< / p>

Route::prefix('api')
     ->middleware('api')
     ->middleware('auth:api', ['only' => ['store', 'edit', 'delete']])
     ->middleware('auth:api', ['except' => ['index', 'show']])
     ->namespace($this->namespace)
     ->group(base_path('routes/api.php'));
Route::prefix('web')
    ->middleware('api')
    ->middleware('auth', ['only' => ['store', 'edit', 'delete']])
    ->middleware('auth', ['except' => ['index', 'show']])
    ->namespace($this->namespace)
    ->group(base_path('routes/api.php'));

但是,很明显,在列出的官方文档中,您可以在路径中使用此方法创建多个中间件:

route->middleware('middleware1', 'middleware2')

无论如何都要将“只有这些方法”和“除了这些方法”应用于路由组吗?如果不是,是否有另一种方法可以解决我的控制器中的这个问题,以便他们知道请求来自哪个路由组并相应地使用不同的中间件?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,route groups(如评论中所建议)是执行您所描述的事情的“官方”方式,尤其是嵌套它们时。

嵌套组尝试智能地将属性与其父组“合并”。中间件以及在附加名称,名称空间和前缀时合并条件的位置。 URI前缀中的命名空间分隔符和斜杠会在适当的地方自动添加。

您还可以为group方法提供一系列选项:

// routes/api.php
$namespaces = [
    'namespace1',
    'namespace2',
    'namespace3',
    ...
];

foreach ($namespaces as $namespace) {

    Route::group(['namespace' => $namespace], function() {

        Route::group([
            'prefix' => 'api',
            'middleware' => [
                'api',
                ['auth:api', ['only' => ['store', 'edit', 'delete']]],
                ['auth:api', ['except' => ['index', 'show']]]
            ],
        ], function() {

            // api controller methods here

        });

        Route::group([
            'prefix' => 'web',
            'middleware' => [
                'api',
                ['auth', ['only' => ['store', 'edit', 'delete']]],
                ['auth', ['except' => ['index', 'show']]]
            ],
        ], function() {

            // web controller methods here

        });

    });

}

但是请注意,您可能需要重新排列阵列顺序才能获得所需的效果:

中间件按照它们在数组中列出的顺序执行