在AppServiceProvider中访问用户?

时间:2017-05-10 18:13:03

标签: laravel laravel-5 laravel-5.3

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

以下是AppServiceProvider目前的情况:

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

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

在我找到previous solution之后,我尝试了这样做:

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

这很有效,但问题是只要呈现视图就会调用闭包。

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

那么如何在AppServiceProvider

中正确访问用户

1 个答案:

答案 0 :(得分:1)

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

还有其他可用选项,例如过滤器或父控制器。优秀的答案here