在服务提供商中添加路由并使用会话信息

时间:2018-11-16 20:23:51

标签: php laravel

tl; dr;如何获取会话数据,然后基于身份验证,在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()也将在boot()方法中返回null。

没有路由的会话数据

我可以使用自己的中间件扩展\Illuminate\Session\Middleware\StartSession,并在重载的session.started方法末尾触发类似startSession()的事件。有了这个,我应该拥有执行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');
            });
        }
    });
}

但是,由于该阶段已经很久了,因此目前不会添加路线。

正确的解决方案提示

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

如果我甚至可以在提供路由之前就可以访问会话数据,那就太好了,因为这样更干净,更快,更安全地包含了用户可以访问的路由,而不是检查每个呼叫添加到它们或在添加它们并检查授权后将其删除。

参考

0 个答案:

没有答案