如何在 Laravel 5.2 中拥有全局 $user 变量?

How to have global $user variable in Laravel 5.2?

上下文

Laravel ships with two authentication controllers out of the box, which are located in the App\Http\Controllers\Auth namespace.

...

You may access the authenticated user via the Auth facade: $user = Auth::user();

参考:Laravel 5.2 Documentation

我能够成功登录并被重定向到 AuthController.php 中定义的正确位置,但现在我需要访问我的大部分视图中的 $user 对象比如查看用户信息,访问权限等

问题

如何在我的所有视图中正确地提供对 $user 变量的访问权限?

其他人是如何做到的

用户imJohnBen of Laracast asked how a Laravel 5 service provider can be used to share view variables。他后来分享了他如何能够使用现有的 ComposerServiceProvider 并添加了一个 GlobalComposer 以便能够在所有视图上共享变量。

我按照他的回答做了,但是少了一步。我无法为 Laracast 论坛做出贡献,因此导致创建了这个 Whosebug 问题。

我在这里使用的 Laravel 版本是 Laravel 5.2.*.

回答

  1. 找到现有的ComposerServiceProviderclass。我在 vendor/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php.

  2. 中找到了我的
  3. Import/reference 文件顶部的 ViewFactory 依赖项。

    use Illuminate\Contracts\View\Factory as ViewFactory;
    
  4. 添加boot方法,如果已经存在则修改。确保 ViewFactory 已注入(将其作为参数添加到引导函数中):

    /**
      * Register bindings in the container.
      *
      * @return void
      */
      public function boot(ViewFactory $view)
      {
          $view->composer('*', 'App\Http\ViewComposers\GlobalComposer');
      }
    
  5. 在您的 app/Http 文件夹中创建一个 ViewComposers 文件夹。
  6. ViewComposers 文件夹中创建一个 GlobalComposer.php 文件,包含以下内容:

    <?php
    namespace App\Http\ViewComposers;
    
    use Illuminate\Contracts\View\View;
    use Illuminate\Support\Facades\Auth;
    
    class GlobalComposer {
    
        /**
         * Bind data to the view.
         *
         * @param  View  $view
         * @return void
         */
        public function compose(View $view)
        {
            $view->with('user', Auth::user());
        }
    
    }
    
  7. (缺少的步骤)最后,通过转到您的 config/app.php 文件并确保 ComposerServiceProvider 在您的提供商列表中,确保所有内容都已连接。

    'providers' = [
        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
    
        // etc...
    
        Illuminate\Foundation\Providers\ComposerServiceProvider::class,
    ] 
    

之后,$user 变量和您在 GlobalComposer 中定义的任何其他变量都可以在您呈现的任何视图中访问。