共计 1244 个字符,预计需要花费 4 分钟才能阅读完成。
在 Laravel 中实现菜单的无限极分类可以使用递归的方式来实现。以下是一个基本的无限极分类的示例:
1、首先在数据库中创建一个菜单表,包含以下字段:
id:菜单的唯一标识符
parent_id:当前菜单的父级菜单的 id,如果没有父级菜单,则为 NULL
name:菜单的名称
url:菜单的链接地址
order:菜单的排序
2、在菜单模型中创建一个递归方法,该方法将返回一个多维数组,其中包含所有菜单的子菜单以及它们的子菜单。
class Menu extends Model
{public function children()
{return $this->hasMany(Menu::class, 'parent_id', 'id');
}
public function recursiveChildren()
{$children = $this->children;
if ($children->isEmpty()) {return null;}
foreach ($children as $child) {$child->children = $child->recursiveChildren();}
return $children;
}
}
在上面的代码中,children 方法将返回当前菜单的所有子菜单。在 recursiveChildren 方法中,使用递归的方式获取当前菜单的所有子菜单以及它们的子菜单,并将其存储在一个名为 children 的属性中。
3、在控制器中查询所有的顶级菜单,并使用 recursiveChildren 方法获取它们的所有子菜单。
class MenuController extends Controller
{public function index()
{$menus = Menu::whereNull('parent_id')->get();
foreach ($menus as $menu) {$menu->children = $menu->recursiveChildren();}
return view('menu.index', compact('menus'));
}
}
在上面的代码中,首先使用 whereNull 方法查询所有顶级菜单,然后使用 recursiveChildren 方法获取它们的所有子菜单,并将它们存储在 children 属性中。最后将数据传递到视图中进行渲染。
4、在视图中使用循环和递归方式渲染菜单。
<ul>
@foreach ($menus as $menu)
<li>
<a href="{{$menu->url }}">{{$menu->name }}
</a>
@if ($child->children)
<ul>
@foreach ($child->children as $child)
@include('menu.child', ['child' => $child])
@endforeach
</ul>
@endif
在上面的代码中,使用循环和递归方式渲染菜单。如果当前菜单有子菜单,则使用递归方式渲染它们。在子菜单模板中,也使用递归方式渲染所有子菜单。