Laravel后台仪表盘变量需求:合并配置生成可缓存导航链接
完善Laravel后台仪表盘链接合并逻辑 + 实现缓存方案
我来帮你搞定这个需求——既要补全链接合并的代码,还要把最终的变量缓存起来,方便后台布局模板直接调用。下面分步骤说清楚:
一、补全链接合并的完整逻辑
你原来的代码里array_merge部分没写完,其实用array_splice就可以直接把分类链接插入到指定位置,不用手动拆分再合并,更简洁。核心思路是:
- 根据用户角色拿到基础的仪表盘链接配置
- 遍历分类配置,把每个分类的链接插入到基础链接的指定
order位置
完整代码如下:
// 1. 根据用户角色获取基础仪表盘链接(复制一份,避免修改原配置数组) $baseLinks = Auth::user()->hasRole(['root', 'admin']) ? config('dashboard') : config('dashboard-user'); $dashboardLinks = $baseLinks; // 2. 获取分类配置 $taxonomies = config('taxonomies'); // 3. 遍历分类,插入到指定位置 foreach ($taxonomies as $taxonomyName => $taxonomyConfig) { // 兜底处理:如果没设置order,默认插到链接列表末尾 $insertPosition = isset($taxonomyConfig['order']) ? (int)$taxonomyConfig['order'] : count($dashboardLinks); // 构造分类链接(要和你的dashboard配置里的链接结构保持一致) $taxonomyLink = [ 'title' => $taxonomyConfig['title'] ?? ucfirst($taxonomyName), // 优先用配置里的标题,没有就用分类名首字母大写 'url' => $taxonomyConfig['url'] ?? "/taxonomies/{$taxonomyName}", // 同理处理URL // 可以加其他字段,比如icon、权限判断等,根据你的需求来 ]; // 用array_splice直接插入到指定位置,第三个参数0表示不删除元素,只插入 array_splice($dashboardLinks, $insertPosition, 0, [$taxonomyLink]); }
二、给合并后的变量加上缓存
每次请求都重新合并链接太浪费性能,我们把结果缓存起来。缓存键要考虑两个点:用户角色(不同角色基础链接不同)和分类配置是否更新(配置变了缓存要失效)。
方案1:通用缓存键(适合所有缓存驱动)
用用户角色标识 + 分类配置的哈希值做缓存键,这样分类配置一修改,哈希值就变,缓存自动失效:
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Hash; // 生成唯一缓存键 $userRoleFlag = Auth::user()->hasRole(['root', 'admin']) ? 'admin' : 'user'; $taxonomiesHash = Hash::make(serialize(config('taxonomies'))); // 把分类配置序列化后哈希,配置变了哈希就变 $cacheKey = "dashboard_links_{$userRoleFlag}_{$taxonomiesHash}"; // 从缓存取,不存在就计算并存入(缓存有效期设为1天,可按需调整) $dashboardLinks = Cache::remember($cacheKey, now()->addDay(), function () { // 这里放上面的合并逻辑代码 $baseLinks = Auth::user()->hasRole(['root', 'admin']) ? config('dashboard') : config('dashboard-user'); $dashboardLinks = $baseLinks; $taxonomies = config('taxonomies'); foreach ($taxonomies as $taxonomyName => $taxonomyConfig) { $insertPosition = isset($taxonomyConfig['order']) ? (int)$taxonomyConfig['order'] : count($dashboardLinks); $taxonomyLink = [ 'title' => $taxonomyConfig['title'] ?? ucfirst($taxonomyName), 'url' => $taxonomyConfig['url'] ?? "/taxonomies/{$taxonomyName}", ]; array_splice($dashboardLinks, $insertPosition, 0, [$taxonomyLink]); } return $dashboardLinks; });
方案2:标签缓存(适合Redis/Memcached驱动,方便批量失效)
如果你用的是支持缓存标签的驱动,给缓存加个标签,以后修改分类配置后,直接清除标签下的所有缓存就行:
use Illuminate\Support\Facades\Cache; $userRoleFlag = Auth::user()->hasRole(['root', 'admin']) ? 'admin' : 'user'; $cacheKey = "dashboard_links_{$userRoleFlag}"; // 给缓存加上标签,方便后续批量清除 $dashboardLinks = Cache::tags(['dashboard_links', 'taxonomies'])->remember($cacheKey, now()->addDay(), function () { // 合并逻辑同上,这里省略 }); // 当你修改了taxonomies配置后,执行下面的代码清除所有相关缓存: // Cache::tags('taxonomies')->flush();
三、把变量共享到后台布局模板
最后一步,把这个缓存后的变量共享给所有后台布局模板,最方便的方式是在AppServiceProvider的boot方法里用视图Composer:
public function boot() { // 给所有admin/layouts开头的视图共享变量 view()->composer('admin.layouts.*', function ($view) { // 这里放上面的缓存+合并逻辑 $userRoleFlag = Auth::user()->hasRole(['root', 'admin']) ? 'admin' : 'user'; $taxonomiesHash = Hash::make(serialize(config('taxonomies'))); $cacheKey = "dashboard_links_{$userRoleFlag}_{$taxonomiesHash}"; $dashboardLinks = Cache::remember($cacheKey, now()->addDay(), function () { $baseLinks = Auth::user()->hasRole(['root', 'admin']) ? config('dashboard') : config('dashboard-user'); $dashboardLinks = $baseLinks; $taxonomies = config('taxonomies'); foreach ($taxonomies as $taxonomyName => $taxonomyConfig) { $insertPosition = isset($taxonomyConfig['order']) ? (int)$taxonomyConfig['order'] : count($dashboardLinks); $taxonomyLink = [ 'title' => $taxonomyConfig['title'] ?? ucfirst($taxonomyName), 'url' => $taxonomyConfig['url'] ?? "/taxonomies/{$taxonomyName}", ]; array_splice($dashboardLinks, $insertPosition, 0, [$taxonomyLink]); } return $dashboardLinks; }); // 把变量传给视图 $view->with('dashboardLinks', $dashboardLinks); }); }
这样在你的后台布局模板(比如resources/views/admin/layouts/app.blade.php)里,直接循环调用就行:
<!-- 侧边栏菜单示例 --> <ul class="sidebar-nav"> @foreach($dashboardLinks as $link) <li class="nav-item"> <a class="nav-link" href="{{ url($link['url']) }}"> {{ $link['title'] }} </a> </li> @endforeach </ul>
额外提醒
- 如果用户角色会动态变更(比如管理员给用户改了角色),建议把用户ID加入缓存键(比如
dashboard_links_{Auth::id()}_{$taxonomiesHash}),这样每个用户的缓存独立,角色变了下次请求会自动重新计算。 - 缓存有效期可以根据你的配置更新频率调整,比如配置很少改就设一周,经常改就设几小时。
- 确保
taxonomies里的order是合法的数组索引,代码里已经做了兜底,但配置里尽量设正确值哦。
内容的提问来源于stack exchange,提问作者poashoas
相关产品推荐
相关产品推荐

