创建后台管理的目录树,通过composer定义代码,providers进行关联,最终在view中应用。解决反复代码的问题。
1、创建compser
App\Http\ViewComposers创建AdminmenuCompose.php.
代码目的是读取数据产生二级目录树。
<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use App\Models\AdminMenu; // 假设有一个 AdminMenu 模型存储菜单数据
class AdminmenuCompose
{
public function compose(View $view)
{
// 获取顶级菜单
$topLevelMenus = AdminMenu::active()->where('parent_id', 0)->with('children')->orderBy('order')->get();
// 处理成树形结构
$nestedMenus = [];
foreach ($topLevelMenus as $menu) {
$menu->setRelation('subMenus', $menu->children()->active()->orderBy('order')->get());
$nestedMenus[] = [
'menu' => $menu,
'subMenus' => $this->buildSubMenuTree($menu->children),
];
}
$view->with('admin_menus', $nestedMenus);
}
// 嵌套菜单处理辅助函数保持不变
protected function buildSubMenuTree($children)
{
$subMenus = [];
foreach ($children as $child) {
$child->setRelation('subMenus', $child->children()->active()->orderBy('order')->get());
$subMenus[] = [
'menu' => $child,
'subMenus' => $this->buildSubMenuTree($child->children),
];
}
return $subMenus;
}
}
2、添加Provider服务
在App\Providers\AppServiceProvider.php中添加服务在boot()中
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Http\ViewComposers\AdminmenuCompose;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
view()->composer('partials.admin.sidebar', AdminmenuCompose::class);
}
}
3、在模板中partials.admin.sidebar使用
<!-- resources/views/partials/admin/sidebar.blade.php -->
<div class="sidebar">
<!-- 左侧导航 -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
{{-- 使用循环遍历 $admin_menus 变量 --}}
@foreach ($admin_menus as $menu)
<li class="nav-item {{ Request::is($menu['menu']->url . '*') ? 'active' : '' }}">
<a class="nav-link" href="javascript:;">
<i class="{{ $menu['menu']->icon }}"></i>{{ $menu['menu']->title }}</a>
{{-- 如果有子菜单 --}}
@if (isset($menu['subMenus']) && count($menu['subMenus']))
<ul class="submenu">
@foreach ($menu['subMenus'] as $subMenu)
<li class="nav-item">
@if(isset($subMenu['menu']->route_name) && Route::has($subMenu['menu']->route_name))
<a class="nav-link" href="{{ route($subMenu['menu']->route_name) }}">
@else
<a class="nav-link" href="{{ $subMenu['menu']->url }}">
@endif
<i class="{{ $subMenu['menu']->icon_class }}"></i>{{ $subMenu['menu']->title }}</a>
</li>
@endforeach
</ul>
@endif
</li>
@endforeach
</ul>
</nav>
</div>
4、命令提示符执行代码更新自动加载
composer dump-autoload