Laravel 与所有视图共享数据,最佳做法

Laravel 与所有视图共享数据,最佳做法,laravel,laravel-8,Laravel,Laravel 8,我使用AppServiceProvider获取页面上的所有类别 类AppServiceProvider扩展了ServiceProvider { /** *注册任何应用程序服务。 * *@返回无效 */ 公共函数寄存器(){} /** *引导任何应用程序服务。 * *@返回无效 */ 公共函数boot() { view()->creator('layouts.app',函数($view){ //类别缓存 $categories=Cache::rememberForever('categories'

我使用AppServiceProvider获取页面上的所有类别

类AppServiceProvider扩展了ServiceProvider
{
/**
*注册任何应用程序服务。
*
*@返回无效
*/
公共函数寄存器(){}
/**
*引导任何应用程序服务。
*
*@返回无效
*/
公共函数boot()
{
view()->creator('layouts.app',函数($view){
//类别缓存
$categories=Cache::rememberForever('categories',function(){
返回类别::where(“parent_id”,“=”,null)->with('subcategory.subcategory')->get();
});
视图()->共享('categories',$categories);
});
}
}
数据可以在master layouts.app视图中访问,但不能在其包含的视图中访问。 因此,在我的layouts/app.blade.php中,我有这样一句话:
@yield('content')
遗憾的是,包含的内容中没有变量
$categories
。我怎样才能改变它

错误:
未定义变量:categories
$categories]) 但是它给出了错误
htmlspecialchars()期望参数1是字符串,数组给定

如果您使用
view()->creator('layouts.app')
,则您在该回调中共享的每个变量将仅与
layouts.app
视图和
layouts.app
包含的任何视图共享

例如,如果您使用
@extends
,一个名为
example.blade.php
的新视图使用
@extends('layouts.app')扩展了
layouts.app
,那么在
extends.blade.php
视图中将无法访问
类别
变量,因为你对laravel说过只通过
view()->creator()`方法与
layouts.app
共享该变量

@yield
指令用于显示给定节的内容

例如: 我的
inc.test
视图包含以下内容:


包括“测试”视图。
@第节(“职位”) Post id:{{$Post->id}测试 @端部
我的
welcome.blade.php
视图包含
inc.test
并生成
post
部分,包含以下内容:

这是一个受欢迎的视图。

它有一个通过AppServiceProvider共享的'post'变量。


在这里,我将包含“inc.test”视图,并从该视图中生成post部分:

@包括(‘公司测试’) @收益率(‘后’)
由于我通过服务提供商将
post
变量与
welcome
视图共享,因此
welcome
包含的所有视图都可以使用该变量

view()->creator('welcome',function($view){
view()->share('post',post::first());
});
这是我的浏览器中的结果:


好的,你包括了inc.test,但是你能在@yield('post')中访问post吗?是的,
@部分('post')
在我使用
@yield
指令之前不会显示。Post-id:1测试来自于这个结果。@phpismyposion你能把你的观点添加到这个问题中吗?也许这有助于理解正在发生的事情。