Laravel 5.6全局视图共享用户连接列表的登录态问题
解决Laravel 5.6中全局视图共享用户连接列表的问题
你遇到的问题其实挺典型的——服务提供者的boot方法只会在应用启动时执行一次,所以用View::share一次性设置的connections变量,不仅在未登录时因为Auth::id()为null可能报错,而且用户登录后也不会自动刷新成当前用户的连接列表。
这里给你两个靠谱的解决方案,都是利用**视图合成器(View Composer)**来实现,它会在视图渲染的时刻动态生成数据,完美解决一次性共享的局限性:
方案一:直接在AppServiceProvider中注册闭包式合成器
修改AppServiceProvider的boot方法,替换原来的View::share代码:
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\Auth; use App\Connection; public function boot() { View::composer('*', function ($view) { // 先初始化空数组,避免未登录时变量不存在 $connections = []; // 只有用户登录时才获取连接列表 if (Auth::check()) { $connections = Connection::getList(Auth::id()); } $view->with('connections', $connections); }); }
这样做的好处是:
- 每次渲染视图时都会执行这段逻辑,用户登录后能拿到最新的连接列表
- 未登录时给空数组,视图里使用
$connections不会出现变量未定义或者报错的情况
方案二:创建独立的视图合成器类(适合复杂逻辑)
如果后续关于连接列表的逻辑会变得复杂,可以把这部分代码抽成单独的类,更便于维护:
- 先创建
app/Http/View/Composers/ConnectionsComposer.php文件:
namespace App\Http\View\Composers; use Illuminate\View\View; use Illuminate\Support\Facades\Auth; use App\Connection; class ConnectionsComposer { public function compose(View $view) { $connections = Auth::check() ? Connection::getList(Auth::id()) : []; $view->with('connections', $connections); } }
- 然后在
AppServiceProvider的boot方法中注册这个合成器:
use App\Http\View\Composers\ConnectionsComposer; use Illuminate\Support\Facades\View; public function boot() { // 给所有视图注册合成器,如果你只想给特定视图注册,可以把'*'换成视图名,比如'layouts.*' View::composer('*', ConnectionsComposer::class); }
额外注意点
如果你的Connection::getList()方法在传入null时会抛出错误,一定要确保只有在Auth::check()为true时才调用它——上面的方案已经帮你处理了这个情况,未登录时直接返回空数组,避免触发错误。
内容的提问来源于stack exchange,提问作者Tushar Bhatt
相关产品推荐
相关产品推荐

