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

Laravel 5.5 global variable in template from service provider

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

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);
    }
}

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

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

如果这类似于布局,您需要此变量,因为您可以改用视图编辑器。有一些选项完全取决于您的需要。

发生这种情况是因为 Laravel 正在加载服务提供商时身份验证功能尚未初始化。一种处理方法是将逻辑移到视图中:

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

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

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