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

文档中是这样调用的

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');
        ...
    });

不知道是什么原因...

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

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

6个月前
讨论数量: 3

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

6个月前

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方法, 但是显然参数位置就不太对了

6个月前

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

6个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!