关于路由里中间件使用的问题?

文档中是这样调用的

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // 使用 first 和 second 中间件
    });

    Route::get('user/profile', function () {
        // 使用 first 和 second 中间件
    });
});

但是我在项目这样会报错..

Route::middleware(['loginAuth'])->group(['prefix' => 'news'], function(){
        Route::get('/list','NewsController@list')->name('backstage.news');
        ...
    });

报错信息如下..

Symfony \ Component \ Debug \ Exception \ FatalErrorException (E_UNKNOWN)
Illuminate\Routing\Router::loadRoutes(): Failed opening required 'Array' (include_path='.:/usr/share/php')

但是如果这样写就没问题.

    Route::group(['prefix' => 'news','middleware'=>'admin.loginAuth'], function(){
        Route::get('/list','NewsController@list')->name('backstage.news');
        ...
    });

不知道是什么原因...

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

Route 门面直接静态调用的 group 方法和 middleware 方法链式调用的 group 并不是同一个,后者参数只能一个闭包。

当我们调用 Route Facades 的静态方法时,Laravel 会从服务容器种解析出 router 实例。
根据文档 Facades 类参考可知,Route 门面对应的的底层类是 Illuminate\Routing\Router。

file

在此类中,存在 group 方法,Route::group 调用的就是该方法:

file

而 middleware 方法并不存在,于是 __call 魔术方法给出一个 RouteRegistrar 的实例,并调用该实例的 middleware 方法,RouteRegistrar 中 group 方法只接受一个闭包参数。

file

5年前 评论
讨论数量: 3

有找到问题所在吗,我也在看路由的源码

5年前 评论

Route::middleware() 返回的不是Illuminate\Routing\Router实例, 所有没办法调用Illuminate\Routing\Router的group方法, 而调用的是Illuminate\Routing\RouteRegistrar的group方法, 贴源码给你看看:

 /**
     * Dynamically handle calls into the router instance.
     *
     * @param  string  $method
     * @param  array  $parameters
     * @return mixed
     */
    public function __call($method, $parameters)
    {
        if (static::hasMacro($method)) {
            return $this->macroCall($method, $parameters);
        }

        if ($method == 'middleware') {
            return (new RouteRegistrar($this))->attribute($method, is_array($parameters[0]) ? $parameters[0] : $parameters);
        }

        return (new RouteRegistrar($this))->attribute($method, $parameters[0]);
    }

group方法

/**
     * Create a route group with shared attributes.
     *
     * @param  \Closure|string  $callback
     * @return void
     */
    public function group($callback)
    {
        $this->router->group($this->attributes, $callback);
    }

虽然最后还是调用到了Illuminate\Routing\Router的group方法, 但是显然参数位置就不太对了

5年前 评论

Route 门面直接静态调用的 group 方法和 middleware 方法链式调用的 group 并不是同一个,后者参数只能一个闭包。

当我们调用 Route Facades 的静态方法时,Laravel 会从服务容器种解析出 router 实例。
根据文档 Facades 类参考可知,Route 门面对应的的底层类是 Illuminate\Routing\Router。

file

在此类中,存在 group 方法,Route::group 调用的就是该方法:

file

而 middleware 方法并不存在,于是 __call 魔术方法给出一个 RouteRegistrar 的实例,并调用该实例的 middleware 方法,RouteRegistrar 中 group 方法只接受一个闭包参数。

file

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!