Laravel如何设置可在全部blade模板中使用的全局变量
Laravel Blade 全局变量配置方案
方法1:全局视图共享(适合全模板通用的少量数据)
这是实现成本最低的方案,配置后所有Blade模板都可以直接调用对应变量:
- 打开
app/Providers/AppServiceProvider.php文件 - 在
boot方法中添加如下代码:
<?php namespace App\Providers; use Illuminate\Support\Facades\View; use App\Models\SiteConfig; // 替换为你实际需要查询的模型类 use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { // 全局共享站点配置数据 View::share('site_config', SiteConfig::first()); } }
配置完成后在任意Blade模板中都可以直接调用{{ $site_config->title }}等属性。
方法2:视图合成器(适合指定模板绑定数据)
如果不需要给所有模板传参,仅需要给公共布局模板传数据,推荐使用该方案,避免全局数据冗余:
在AppServiceProvider的boot方法中添加如下代码:
// 仅给layouts.app主布局模板传递导航菜单数据 View::composer('layouts.app', function ($view) { $view->with('nav_menus', \App\Models\Menu::where('is_show', 1)->orderBy('sort')->get()); }); // 同时给多个视图绑定数据 View::composer(['layouts.app', 'layouts.admin', 'common.footer'], function ($view) { $view->with('site_copyright', \App\Models\SiteConfig::value('copyright')); });
配置完成后只有指定的模板可以拿到对应变量,不会污染其他视图。
方法3:自定义Blade指令(适合复用逻辑场景)
如果需要复用的是带逻辑的输出内容,可以自定义Blade指令实现全局调用:
在AppServiceProvider的boot方法中添加如下代码:
use Illuminate\Support\Facades\Blade; public function boot() { // 自定义站点名称输出指令 Blade::directive('siteName', function () { $siteName = \App\Models\SiteConfig::value('name') ?? '默认站点名称'; return "<?php echo '$siteName'; ?>"; }); }
配置完成后在任意Blade模板中直接使用@siteName即可输出站点名称。
注意事项
- 全局查询的静态数据一定要加缓存,避免每个请求都访问数据库,可通过Laravel模型缓存或者
Cache门面存储数据,降低数据库压力。 - 模板调用变量时做好空值判断,推荐使用
{{ $site_config?->title ?? '默认值' }}的写法,避免数据为空时模板报错。 - 禁止直接在Blade模板中编写数据库查询逻辑,所有数据获取逻辑都要放在服务提供者或者单独的服务类中处理,保证代码可维护性。
内容的提问来源于stack exchange,提问作者joy dhar
相关产品推荐
相关产品推荐

