在 AppServiceProvider 中访问用户?

Access user in AppServiceProvider?

我需要能够在用户登录时将数据传递给所有视图。

这是我的 AppServiceProvider 目前的样子:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        if (Auth::check())
        {
            View::share('key', 'value');
        }
    }
}

但是,数据永远不会传递给视图,因为我不能在 AppServiceProvider 中使用 Auth(出于某种原因),所以永远不会满足 if 语句条件。

我发现 之后,我尝试这样做:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::composer('*', function ($view)
        {
            if (Auth::check())
            {
                View::share('key', 'value');
            }
        }
    }
}

这行得通,但问题是每当呈现视图时都会调用闭包。

例如,如果我的 blade 模板包含 3 个其他 blade 模板(确实如此),那么上面的闭包将被调用 4 次。 Explained further here.

那么如何在AppServiceProvider中正确访问用户呢?

Auth 方法在 AppSeviceProvider 的直接上下文中不起作用的原因是 Auth 系统尚未加载。在定义的闭包中,Auth 系统将可用,因为它总是在执行此闭包之前加载。因此,问题出在视图编辑器的使用方式上。

composer 方法仅接受视图标识符数组(或字符串)和 *。因此,以下选项可用:

定义多个视图

View::composer(['about', 'contact'], function ($view)
{
    if (Auth::check())
    {
        View::share('key', 'value');
    }
}

定义一个视图,并使其成为所有相关页面的主要父视图

例如,您可以定义一个 main.blade.php 并使用所有相关视图扩展此视图。

@extends('main')

并分享 main 视图:

View::composer('main', function ($view)
{
    if (Auth::check())
    {
        View::share('key', 'value');
    }
}

还有其他可用选项,例如过滤器或父控制器。很好的回答 .