Laravel 5 资源路由加中间件

68

是否可以向资源路由的所有或某些项添加中间件?

例如...

<?php

Route::resource('quotes', 'QuotesController');

此外,如果可能的话,我希望除了 indexshow 之外的所有路由都使用 auth 中间件。这是需要在控制器内完成的吗?

5个回答

120

QuotesController的构造函数中,您可以使用以下代码:

$this->middleware('auth', ['except' => ['index','show']]);

参考资料:Laravel 5中的控制器中间件


谢谢!我不确定这是否可以在资源调用中完成,但从我目前所看到的情况来看似乎不行。 - kilrizzy
我需要将其他参数传递给中间件,这是否可能? - psiyum
@activatedgeek 如果你有新的问题,请提出一个。 - Marcin Nabiałek
使用Route::apiResources([])时怎么办?没有找到一次性为所有apiResources添加中间件的方法? - trainoasis

66

你可以使用路由组(Route Group)与中间件(Middleware)概念:

http://laravel.com/docs/master/routing
Route::group(['middleware' => 'auth'], function()
{
    Route::resource('todo', 'TodoController', ['only' => ['index']]);
});

2
大约一年前,但既然我也在尝试做同样的事情,那么不应该是 Route::resource('todo', 'TodoController', ['except' => ['index']]); 来从身份验证中间件中仅排除索引吗? - Anadi Misra
这取决于您想要在哪个控制器上进行身份验证。总体思路仍然相关,提供的链接也是如此,在我看来。 - dmcoding

6
在使用PHP 7的Laravel中,直到我编写了多方法排除才能正常工作。
Route::group(['middleware' => 'auth:api'], function() {
        
Route::resource('categories', 'CategoryController', ['except' => 'show,index']);
});

也许这能帮助某些人。

5

LARAVEL 8.x 更新

web.php:

Route::resource('quotes', 'QuotesController');

在您的控制器中:
public function __construct()
{
        $this->middleware('auth')->except(['index','show']);
        // OR
        $this->middleware('auth')->only(['store','update','edit','create']);
}

参考: 控制器中间件


2

我一直在寻找更好的Laravel 5.8+解决方案。

以下是我的做法:

将中间件应用于资源,除了那些你不想应用中间件的部分。(这里是索引和展示)

 Route::resource('resource', 'Controller', [
            'except' => [
                'index',
                'show'
            ]
        ])
        ->middleware(['auth']);

然后,创建在第一个路由中未包含的资源路由。也就是 index 和 show。

Route::resource('resource', 'Controller', [
        'only' => [
            'index',
            'show'
        ]
    ]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接