Laravel 5自定义助手无法获取当前登录用户ID的解决咨询
解决Laravel中AppServiceProvider里无法获取认证用户的问题
这个问题我之前也碰到过,核心原因是Laravel的服务提供者boot()方法执行时机早于认证中间件的运行——这时候用户还没走完认证流程,所以Auth::user()自然会返回null。给你两个靠谱的解决思路:
方案一:用视图Composer替代直接在boot里共享数据
视图Composer是在视图渲染的时候才执行的,这时候认证已经完成,完全可以安全获取当前用户信息。
修改AppServiceProvider的boot()方法:
public function boot() { // 针对所有视图共享数据,也可以指定特定视图比如'layouts.sidebar' View::composer('*', function ($view) { // 先判断用户是否登录,避免未登录时报错 if (Auth::check()) { $view->share('tree', customhelper::generateSiteTree(0, Auth::user()->id)); } else { // 处理未登录场景,比如传空数组或者默认菜单树 $view->share('tree', []); } }); }
然后更新你的自定义助手方法,新增用户ID参数:
public static function generateSiteTree($startAt, $userId) { // ...你的其他逻辑代码 $children = UserPermission::getLeftNavByUserId($startAt, $userId); // ...你的其他逻辑代码 }
方案二:延迟到请求周期后期处理(不推荐,仅作补充)
如果一定要在服务提供者里处理,可以借助Laravel的请求生命周期钩子,但这种方式不如视图Composer优雅。比如在boot()方法里监听Illuminate\Auth\Events\Authenticated事件,当用户认证完成后再共享数据,但这种方式需要额外处理视图共享的时机,不如第一种方案直接。
注意事项
- 务必加上
Auth::check()判断,防止未登录用户访问时,调用Auth::user()->id抛出错误。 - 如果只需要给特定视图共享数据,把
View::composer('*')里的*换成具体视图名(比如'layouts.main'),能提升性能。
内容的提问来源于stack exchange,提问作者Niladri Banerjee - Uttarpara
相关产品推荐
相关产品推荐

