【问题标题】:Access user in AppServiceProvider?访问 AppServiceProvider 中的用户?
【发布时间】:2017-10-09 12:57:27
【问题描述】:

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

这是我的AppServiceProvider 目前的样子:

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

但是,数据永远不会传递给视图,因为我不能在AppServiceProvider 中使用Auth(出于某种原因),因此永远不会满足 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中正确访问用户呢?

【问题讨论】:

  • 在加载服务提供者时,似乎还没有设置身份验证机制。我能想到的唯一解决方法是为'Illuminate\Auth\Events\Login' 事件添加一个处理程序,它将键和值存储到会话中。然后,您只需将其从视图中的会话中取出。

标签: laravel laravel-5 laravel-5.3


【解决方案1】:

Auth 方法在AppSeviceProvider 的直接上下文中不起作用的原因是尚未加载身份验证系统。在定义的闭包中,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

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 2016-05-20
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多