首页 > 解决方案 > 在 Service Provider 中添加路由和使用会话信息

问题描述

tl;博士; 如何获取会话数据,然后基于身份验证,在 laravel ServiceProvider 中操作路由?

问题

我需要在服务提供商中做两件事。可能同时注册路由和使用会话数据。

现有解决方案

没有会话数据的路由

我知道ServiceProvider::register可能会在RouteProvider::register被调用之前发生。ServiceProvider::boot可以使用这样的东西添加路线...

public function boot(Router $router)
{
    $router->prefix('api')->group(function ($router) {
        $router->resource('lists', '\App\Extensions\ExtensionName\Http\Controllers\MyController');
    });
}

现在这将正确添加路线。但是在访问该路由时,将没有会话数据。因此Auth::user()会返回null。当然,在添加路由期间也会在方法中Auth::user()返回 null 。boot()

没有路由的会话数据

我可以用我自己的中间件扩展它,并在重载方法结束时\Illuminate\Session\Middleware\StartSession触发一个事件。有了这个,我应该拥有执行类似.session.startedstartSession()Auth::user()

public function boot(Router $router)
{
    Event::listen('session.started', function () use ($router) {
        if (Auth::user()->can('do.something')) {
            $router->middleware(['auth'])->prefix('api')->group(function ($router) {
                $router->resource('lists', '\App\Extensions\ExtensionName\Http\Controllers\MyController');
            });
        }
    });
}

但是,此时不会添加路线,因为该阶段已经结束了很长时间。

正确的解决方案提示

我一直倾向于注册我的路由,然后在我的控制器中,我会以某种方式注入会话中间件,以便它在我的控制器代码实际运行之前启动会话。但我不确定如何做这样的事情。

如果我可以在提供我的路线之前访问会话数据,那将是非常好的,因为它会更清洁,更快,更安全地包含用户可以访问的路线,而不是检查每个呼叫他们或在添加它们并检查授权后将其删除。

参考

标签: phplaravel

解决方案


推荐阅读