php - 在 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.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');
});
}
});
}
但是,此时不会添加路线,因为该阶段已经结束了很长时间。
正确的解决方案提示
我一直倾向于注册我的路由,然后在我的控制器中,我会以某种方式注入会话中间件,以便它在我的控制器代码实际运行之前启动会话。但我不确定如何做这样的事情。
如果我可以在提供我的路线之前访问会话数据,那将是非常好的,因为它会更清洁,更快,更安全地包含用户可以访问的路线,而不是检查每个呼叫他们或在添加它们并检查授权后将其删除。
参考
- 如何在 laravel 的服务提供者中检索会话数据?
- https://laracasts.com/discuss/channels/general-discussion/laravel-5-session-data-is-not-accessible-in-the-app-boot-process
- https://github.com/laravel/framework/issues/7906
- https://github.com/laravel/framework/pull/7933
- https://laravel.io/forum/12-17-2014-session-content-not-available-in-service-providers-register
- https://josephsilber.com/posts/2017/01/23/getting-current-user-in-laravel-controller-constructor
解决方案
推荐阅读
- powershell - 如何将 PowerShell 脚本的终端输出重定向到文件
- c# - 如何将数据存储在基于服务的数据库中?
- swift - MacOS:tableView:viewForTableColumn:row:在一定数量的行后停止调用
- jestjs - 测试一个 promise 是否被拒绝?
- r - 嵌套logit模型顺序估计的奇点问题
- python - Selenium - linux mint 上的 executable_path 问题
- java - Java 通过 SSO 从 Rest API Jira 获取 json
- webdriver - TestCafe 的自定义 TestRail 报告器无法获取测试结果
- ffmpeg - 使用 x265 编译 FFMPEG 时出现错误:使用 pkg-config 找不到 x265
- android - 在 ubuntu 18.04 上构建 android-7.1.2_r36 失败