在 laravel 服务提供商 boot() 方法中使用 'auth:web' 中间件定义路由

defining route with 'auth:web' middleware in laravel service provider boot() method

我正在使用一个名为 https://github.com/garygreen/pretty-routes 的包 它的服务提供商 boot() 方法中有一行 (here the code)

它正在从它的配置文件中定义一个带有中间件的获取路由(link to the code)我刚刚将 'auth:web' 添加到它的配置文件中,但似乎 'auth:web' 中间件被尽快调用当代码在 Laravel 引导其 session 之前到达该行时,当 auth('web')->user() 尚未 null

我无法理解的是,我用 laravel/telescope 做了完全相同的事情 (here the code),但它有效。 为什么??? 也在改变:

Route::get(config('pretty-routes.url'), 'PrettyRoutes\PrettyRoutesController@show')
            ->name('pretty-routes.show')
            ->middleware(config('pretty-routes.middlewares'));

至:

$this->app['router']->get(config('pretty-routes.url'), 'PrettyRoutes\PrettyRoutesController@show')
            ->name('pretty-routes.show')
            ->middleware(config('pretty-routes.middlewares'));

in service provider 似乎解决了这个问题,并使此代码的行为类似于 telescope 包使用 'auth:web' 作为中间件的方式。 发生什么事了?

您需要将 web 中间件应用于您需要 session 的任何路由,这是默认身份验证系统正在使用的。当您在没有这个的情况下应用 auth 中间件时,它可能无法解析用户,因为没有 session 可以进行身份​​验证。

您需要应用 web 中间件,然后再应用您想要的任何其他中间件:

'middlewares' => [
    'web', 'auth:web',
],

如果您查看您提供的 telescope 示例,您会发现他们还添加了 web 中间件。所以你并没有完全“做同样的事情”作为 telescope 配置。