【问题标题】:'auth' Middleware with Route::resource'auth' 中间件与 Route::resource
【发布时间】:2015-04-08 05:11:26
【问题描述】:

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

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 4 还是 5?因为标签上写着 4 但中间件是 Laravel 5 中引入的东西......
  • 我使用的是 laravel 4。你确定它是 laravel5 的一个特性吗?
  • 非常有用的问题。我刚开始使用 Laravel 5,文档并不总是很清楚。

标签: authentication laravel laravel-4 middleware


【解决方案1】:

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

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

编辑

显然,在过滤器之前,当您将一个组包裹起来时,它只能与资源路由一起使用。有关示例,请参见 OPs 答案...

【讨论】:

  • 我明白了。由于 laravel 5 现在是公开的,因此他的时间必须使用 laravel 4 显式搜索。
  • 对不起,我必须使用 Route::group
  • @SazzadTusharKhan 我同意。使用 Route:group 是我能找到的唯一解决方案。
【解决方案2】:

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

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

https://stackoverflow.com/a/17512478/540144

【讨论】:

  • 我认为这更接近最佳答案。我无法将 Route:resource 与 Controller 一起作为第二个参数,后跟一个数组。将我所有受保护的路线放入一个组中。
【解决方案3】:

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

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

class MyitemsController extends Controller {

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

【讨论】:

    【解决方案4】:

    如何在 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

    【讨论】:

      【解决方案5】:

      更好的解决方案

      使用中间件代替之前

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

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

      php 工匠路线:列表

      【讨论】:

        猜你喜欢
        • 2018-12-27
        • 2014-06-23
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 2021-01-07
        • 2019-06-14
        • 2015-07-12
        • 2014-06-23
        相关资源
        最近更新 更多