如何在 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();
我能够成功登录并被重定向到 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.*
.
回答
找到现有的ComposerServiceProvider
class。我在 vendor/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php
.
中找到了我的
Import/reference 文件顶部的 ViewFactory
依赖项。
use Illuminate\Contracts\View\Factory as ViewFactory;
添加boot
方法,如果已经存在则修改。确保 ViewFactory
已注入(将其作为参数添加到引导函数中):
/**
* Register bindings in the container.
*
* @return void
*/
public function boot(ViewFactory $view)
{
$view->composer('*', 'App\Http\ViewComposers\GlobalComposer');
}
- 在您的
app/Http
文件夹中创建一个 ViewComposers
文件夹。
在 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());
}
}
(缺少的步骤)最后,通过转到您的 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
中定义的任何其他变量都可以在您呈现的任何视图中访问。
上下文
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();
我能够成功登录并被重定向到 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.*
.
回答
找到现有的
ComposerServiceProvider
class。我在vendor/laravel/framework/src/Illuminate/Foundation/Providers/ComposerServiceProvider.php
. 中找到了我的
Import/reference 文件顶部的
ViewFactory
依赖项。use Illuminate\Contracts\View\Factory as ViewFactory;
添加
boot
方法,如果已经存在则修改。确保ViewFactory
已注入(将其作为参数添加到引导函数中):/** * Register bindings in the container. * * @return void */ public function boot(ViewFactory $view) { $view->composer('*', 'App\Http\ViewComposers\GlobalComposer'); }
- 在您的
app/Http
文件夹中创建一个ViewComposers
文件夹。 在
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()); } }
(缺少的步骤)最后,通过转到您的
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
中定义的任何其他变量都可以在您呈现的任何视图中访问。