如何在Laravel 5中在所有视图之间共享Auth :: user?

8

我需要将当前登录用户共享给所有视图。我正试图在 AppServiceProvider.php 文件中使用 view->share() 方法。

我有以下代码:

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Illuminate\Contracts\Auth\Guard;


class AppServiceProvider extends ServiceProvider {


    public function boot(Guard $guard)
    {
        view()->share('guard', $guard);
        view()->share('user', $guard->user());
    }

    //..
}

然而,当我访问页面(登录后)时,user变量为空。奇怪的是,$guard->user(保护属性,不是公共方法user())不为空。输出结果如下图所示:enter image description here请注意,guard->user变量已被填充,但用户变量为空。

如果您调用check()getUser()方法,您会得到什么? - Kemal Fadillah
check() 返回 false,而 getUser() 返回 NULL - Chris
我觉得它的“检查”时间太早了,但显然boot方法应该等待所有服务都注册并准备就绪。 - Chris
2个回答

9
最好使用View Composers来完成这个任务。
在您的ComposerServiceProvider的boot()方法中:
view()->composer('*', 'App\Http\ViewComposers\GlobalComposer');

在HTTP/ViewComposers中创建一个名为GlobalComposer的类,然后创建以下函数:
public function compose( View $view )
{
    $view->with('authUser', Auth::user());
}

http://laravel.com/docs/5.0/views#view-composers


我认为视图组合器是非常强大的东西,但是 (a) 我想使用注入的 Guard,而不是门面 Auth,以及 (b) view()->share 的用例基本上就是我使用它的方式。虽然,在这个项目的其他部分中,我将使用视图组合器。 - Chris
你能分享一下你想使用注入守卫的具体原因,相对于门面模式吗? - Seb Barre
更正 - 经过进一步的研究,你是正确的。这是由于这个“bug” https://github.com/laravel/framework/issues/6130 。这个SO上的答案比我解释得更好:https://dev59.com/z4Tba4cB1Zd3GeqP1h0p#29817941 - Chris
@SebBarre 我猜是可测试性。在必要的地方注入东西更有意义,特别是如果它是可行的(比如在作曲家中)。 - Oddman
需要注意的一件事是,使用 * 视图组合器时,它将为页面上的每个 view 执行,这意味着每个包含的视图,而不仅仅是主要视图。虽然这对于 Auth::user() 不会产生太大影响,但在此处执行数据库调用时要非常小心。 - Andrew Brown

8

您可以在不创建文件的情况下解决此问题。

将这些代码添加到您的ServiceProvider的boot()操作中,就可以了。

view()->composer('*', function($view){
  $view->with('user', Auth::user());
});

源代码也相同:http://laravel.com/docs/5.0/views#view-composers

查看通配符视图组件


好的解决方案。谢谢! - Marcel Gruber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接