我需要能够在用户登录时将数据传递到所有 View 。
这是我的 AppServiceProvider
目前的样子:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
if (Auth::check())
{
View::share('key', 'value');
}
}
}
但是,数据永远不会传递到 View ,因为我无法在 AppServiceProvider
中使用 Auth
(出于某种原因),因此永远不会满足 if 语句条件。
关注 previous solution我发现,我尝试这样做:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
View::composer('*', function ($view)
{
if (Auth::check())
{
View::share('key', 'value');
}
}
}
}
这有效,但问题是每当渲染 View 时都会调用闭包。
例如,如果我的 Blade 模板包含 3 个其他 Blade 模板(确实如此),那么上面的闭包将被调用 4 次。 Explained further here .
那么如何在AppServiceProvider
中正确访问用户呢?
最佳答案
Auth
方法无法在 AppSeviceProvider
的直接上下文中工作的原因是 Auth 系统尚未加载。在定义的闭包中,Auth 系统将可用,因为它始终在执行此闭包之前加载。因此,问题在于 View 编辑器的使用方式。
composer
方法仅接受 View 标识符数组(或字符串)和 *
。因此,可以使用以下选项:
定义多个 View
View::composer(['about', 'contact'], function ($view)
{
if (Auth::check())
{
View::share('key', 'value');
}
}
定义一个 View ,并将其作为所有相关页面的主要父 View
例如,您可以定义一个 main.blade.php
并使用所有相关 View 扩展此 View 。
@extends('main')
并且只需共享主
View :
View::composer('main', function ($view)
{
if (Auth::check())
{
View::share('key', 'value');
}
}
还有其他可用选项,例如过滤器或父 Controller 。优秀答案here .
关于laravel - 访问AppServiceProvider中的用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43899890/