Laravel全站侧边栏实现:如何全局注入数据避免Ajax请求?
Laravel 全局注入侧边栏数据方案
方法一:视图 Composers(推荐)
视图 Composers 能将数据绑定到指定视图,每次视图渲染时自动注入,无需在每个控制器手动添加数据。
- 步骤1:创建视图 Composer 类
在app/View/Composers目录下新建SidebarComposer.php:
<?php namespace App\View\Composers; use Illuminate\View\View; use App\Models\SidebarItem; // 替换为你的侧边栏数据模型 class SidebarComposer { public function compose(View $view) { // 从数据库查询侧边栏内容,可根据业务添加筛选、排序逻辑 $sidebarContent = SidebarItem::where('status', 'active') ->orderBy('sort_order') ->get(); // 将数据注入视图 $view->with('sidebarContent', $sidebarContent); } }
- 步骤2:注册视图 Composer
在app/Providers/AppServiceProvider.php的boot方法中添加注册逻辑:
use Illuminate\Support\Facades\View; use App\View\Composers\SidebarComposer; public function boot() { // 绑定到你的布局视图(比如 layouts/app.blade.php),仅该布局渲染时触发 View::composer('layouts.app', SidebarComposer::class); // 若需全局所有视图都注入,可使用通配符* // View::composer('*', SidebarComposer::class); }
完成后,直接在布局模板中使用 $sidebarContent 即可,无需修改任何控制器代码。
方法二:全局视图共享
如果所有页面都需要侧边栏数据,可通过服务提供者直接共享全局数据:
在 app/Providers/AppServiceProvider.php 的 boot 方法中添加:
use Illuminate\Support\Facades\View; use App\Models\SidebarItem; public function boot() { // 查询侧边栏数据 $sidebarContent = SidebarItem::where('status', 'active') ->orderBy('sort_order') ->get(); // 全局共享数据 View::share('sidebarContent', $sidebarContent); }
注意:该方式会在每个请求时执行数据库查询,即使当前页面不需要侧边栏(如API接口)。仅当所有页面都依赖侧边栏时推荐使用。
是否需要手动在控制器添加数据?
不需要。Laravel 提供的视图 Composers 和全局共享机制,就是为了解决多视图重复数据注入的问题,完全替代手动添加的繁琐操作,符合DRY(Don't Repeat Yourself)原则。
只有一种极端场景需要手动添加:侧边栏数据需根据每个控制器的独特业务逻辑动态生成,且无法提炼为统一的全局规则。但这种情况非常少见,绝大多数场景下全局注入都能满足需求。
内容的提问来源于stack exchange,提问作者Hoytman
相关产品推荐
相关产品推荐

