来自服务提供商的Laravel 5.5全局变量模板

时间:2017-12-07 12:35:54

标签: php laravel laravel-5 service-provider

如何获取有关服务提供商中已登录用户的信息?当我在我的模板{{$ test}}中使用它时,总是返回0,但我100%确定我已登录。或者mybe你有更好的解决方案吗?

use Illuminate\Support\ServiceProvider;
use Auth;
use View;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $user = Auth::user();
        if ($user !== null) {
            $walletsCount = $user->wallets()->count();
        } else {
            $walletsCount = 0;
        }
        View::share('test', $walletsCount);
    }
}

2 个答案:

答案 0 :(得分:1)

默认情况下,您无法在请求生命周期的早期访问会话。 web中间件组有一个StartSession中间件,负责实际启动和加载会话。默认情况下,Auth系统web后卫使用会话来存储用户。因此您还无权访问会话,因此用户将返回null。该请求甚至还没有进入那堆中间件。

您可以添加中间件来执行此操作。将中间件添加到web堆栈的末尾。当这个中间件运行时,堆栈中的先前中间件已经加载了会话,因此您可以访问那里经过身份验证的用户。

如果这就像一个布局,你需要这个变量,你可以使用视图编辑器。根据您的需要,有一些选择。

答案 1 :(得分:1)

它正在发生,因为当Laravel加载服务提供商时,auth功能尚未初始化。处理它的一种方法是将逻辑移到视图中:

{{ auth()->check() ? auth()->user()->wallets()->count() : 0 }}

另一种方法是使用带闭包的视图编辑器:

public function boot()
{
    view()->composer('*', function($view) {
        $view->with('walletsCount', auth()->check() ? auth()->user()->wallets()->count() : 0);
    });
}