Laravel 5.4如何在所有页面复用变量或查询结果(权限菜单场景)
解决Laravel 5.4全局复用权限查询结果的优雅方案
嘿,这个重复写查询的问题我太懂了,简直是冗余代码的重灾区!Laravel 5.4里其实有好几种优雅的解决方案,完全不用每个控制器都复制粘贴那一段权限查询逻辑。下面给你列几个最实用的:
方案一:视图Composer(最推荐,精准针对视图绑定数据)
这是Laravel专门为「给特定视图绑定数据」设计的功能,完美匹配你的场景——只给_menu.blade.php传权限数据,其他视图不受影响。
步骤如下:
- 创建视图Composer类
在app/Http/View/Composers目录下新建MenuComposer.php(如果目录不存在就自己创建):
<?php namespace App\Http\View\Composers; use Illuminate\View\View; use Illuminate\Support\Facades\Auth; class MenuComposer { // 绑定数据到视图的核心方法 public function compose(View $view) { // 只在用户登录时查询权限,未登录则返回空集合 $userPermissions = Auth::check() ? Auth::user()->permissions // 这里根据你的模型关系调整,比如多对多的话用->permissions()->get() : collect(); // 把权限数据传到视图里,变量名是userPermissions $view->with('userPermissions', $userPermissions); } }
- 在服务提供者里注册Composer
打开app/Providers/AppServiceProvider.php,在boot方法里添加注册代码:
use Illuminate\Support\Facades\View; use App\Http\View\Composers\MenuComposer; public function boot() { // 给_menu.blade.php视图绑定我们的Composer View::composer('_menu', MenuComposer::class); // 如果你想给所有视图都绑定的话,可用通配符:View::composer('*', MenuComposer::class); }
这样以后每次渲染_menu.blade.php时,Laravel都会自动执行Composer里的逻辑,把userPermissions变量传到视图里,你直接在菜单视图里用这个变量判断权限就行,再也不用在每个控制器里传值了!
方案二:全局共享数据(View::share)
如果你的权限数据需要在所有视图里用到,也可以用这个简单粗暴的方法:
直接在AppServiceProvider的boot方法里添加:
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\Auth; public function boot() { View::share('userPermissions', function () { return Auth::check() ? Auth::user()->permissions : collect(); }); }
这个方法会把userPermissions变量共享给所有视图,适合全局需要的场景,但如果只是菜单视图需要的话,方案一更精准。
方案三:中间件(适合请求级别的全局共享)
如果需要在请求周期里提前处理权限逻辑,比如做一些额外的判断,可以用中间件:
- 创建中间件
运行命令php artisan make:middleware SharePermissions,生成的文件在app/Http/Middleware/SharePermissions.php,修改内容:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\Auth; class SharePermissions { public function handle($request, Closure $next) { $userPermissions = Auth::check() ? Auth::user()->permissions : collect(); // 共享数据到所有视图 View::share('userPermissions', $userPermissions); return $next($request); } }
- 注册中间件
打开app/Http/Kernel.php,把中间件加到web中间件组里:
protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \App\Http\Middleware\SharePermissions::class, ], ];
这样每个web请求都会执行这个中间件,把权限数据共享到视图里。
总结
最推荐方案一(视图Composer),因为它逻辑清晰,只针对你需要的菜单视图生效,不会产生冗余数据;如果是全局所有视图都需要权限数据,方案二或三更合适。
内容的提问来源于stack exchange,提问作者Fokrule
相关产品推荐
相关产品推荐

