我需要能够在用户登录时将数据传递给所有视图。
以下是AppServiceProvider
目前的情况:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
if (Auth::check())
{
View::share('key', 'value');
}
}
}
但是,数据永远不会传递给视图,因为我无法在Auth
中使用AppServiceProvider
(出于某种原因),因此永远不会满足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
?
答案 0 :(得分:1)
Auth
方法在AppSeviceProvider
中的直接上下文中不起作用的原因是Auth系统尚未加载。在定义的闭包中,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。