'auth' 中间件 Route::resource

'auth' Middleware with Route::resource

如何将中间件与资源一起使用?

Route::resource('myitem', ['middleware' => 'auth', 'uses' => 'App\Controllers\MyitemsController']);

刚跟https://laracasts.com/discuss/channels/general-discussion/struggling-with-routeresource-and-auth-middleware可惜解决不了

获取错误:

ErrorException (E_UNKNOWN) 
Array to string conversion
Open: /vendor/laravel/framework/src/Illuminate/Routing/Router.php

protected function getResourceAction($resource, $controller, $method, $options)
{
    $name = $this->getResourceName($resource, $method, $options);

    return array('as' => $name, 'uses' => $controller.'@'.$method);
}

中间件是 Laravel 5 的新特性。在Laravel 4、filters 里有类似的东西。因此,您应该使用 beforeafter 而不是使用密钥 middleware。另外,这就是错误的来源,Route::resource 的第二个参数应该是字符串形式的控制器名称,第三个参数是一个选项数组:

Route::resource('myitem', 'App\Controllers\MyitemsController', ['before' => 'auth']);

编辑

显然,当您围绕它包装一个组时,过滤器仅适用于资源路由。有关示例,请参阅 OP 答案...

对资源使用过滤器不起作用,为什么必须使用 Route::group

Route::group(array('before' => 'auth'), function()
{
    Route::resource('myitem', 'App\Controllers\MyitemsController');
});

我刚遇到这个问题,发现最简单的方法是将中间件直接添加到控制器。

我在这里找到了答案: http://laravel.com/docs/master/controllers

class MyitemsController extends Controller {

    /**
     * Instantiate a new MyitemsController instance.
     */
    public function __construct()
    {
        $this->middleware('auth');
    }
}

如何在 Laravel 5 中执行此操作。您一直在等待的答案。

使用middleware代替before

Route::group(array('middleware' => 'auth'), function()
{
    Route::resource('user', 'UserController',
                    ['only' => ['edit']]);
}

检查路由是否设置,运行:

php artisan route:list

应该显示以下内容:

GET|HEAD | user/{user}/edit | user.edit | App\Http\Controllers\UserController@edit | auth

注意 auth 而不是 guest

更好的解决方案

使用中间件而不是之前

Route::group(['middleware' => 'auth'], function(){
   Route::resource('myitem', 'MyitemsController');
});

您可以通过以下方式检查是否正常:

php artisan route:list