tatter / 菜单
CodeIgniter 4 的动态菜单
资助包维护!
tattersoftware
paypal.me/tatter
Requires
- php: ^7.4 || ^8.0
- spatie/menu: ^2.10 || ^3.0
Requires (Dev)
- codeigniter4/framework: ^4.1
- tatter/tools: ^2.0
This package is auto-updated.
Last update: 2024-09-18 15:07:07 UTC
README
CodeIgniter 4 的动态菜单
快速入门
- 使用 Composer 安装:
> composer require tatter/menus
- 通过扩展
Tatter\Menus\Menu
创建您的菜单 - 将您的菜单别名添加到
Config\Menus
- 将
MenuFilter
应用到所有需要菜单的路由
功能
菜单 提供跨您应用程序的动态菜单。 菜单 组织并注入菜单内容,让您可以专注于构建。
安装
通过 Composer 轻松安装,以利用 CodeIgniter 4 的自动加载功能,并始终保持最新状态
> composer require tatter/menus
或者,通过下载源代码并将目录添加到 app/Config/Autoload.php
手动安装。
配置(可选)
可以通过扩展其配置文件来更改库的默认行为。将 examples/Menus.php 复制到 app/Config/ 并遵循注释中的说明。如果 app/Config 中没有找到配置文件,则库将使用自己的配置。
使用
构建
菜单 基于 Spatie\Menu
构建,具有所有其奇妙、动态和流畅的功能。使用他们的文档来制作您想要的简单或复杂的菜单
通过扩展 Tatter\Menus\Menu
创建您的菜单。您会在源代码中注意到 Menu
需要您提供一个方法:public function __toString(): string;
。您可以使用提供的 $builder
属性来访问底层的 Spatie\Menu
来构建您的菜单,或者提供您自己的 HTML 代码或 view()
返回值。以下是一些示例
class MainMenu extends \Tatter\Menus\Menu
{
public function __toString(): string
{
return $this->builder
->link(site_url('/'), 'Home')
->link(site_url('/about'), 'About')
->html('<hr>')
->link(site_url('/contact'), 'Contact')
->render();
}
}
class FruitMenu extends \Tatter\Menus\Menu
{
public function __toString(): string
{
return view('menus/fruit', ['active' => 'banana']);
}
}
注意:$builder
是初始化为“设置为当前 URL”。您可以再次调用 setActive()
来删除或更改活动菜单项。由于 Spatie\Menu
在相对和绝对 URL 混合中的限制,如果您想使用此默认“活动”URL,则必须向 Menu
提供完整的 URL 值(例如,使用 site_url()
)。
部署
由于 Menu
是 Stringable
,因此可以直接在您的视图或布局文件中使用它。但是,菜单 还附带了一个 控制器过滤器,您可以使用它将菜单内容直接注入到响应中。首先,您需要为要使用的每个 Menu
类创建一个别名。创建 app/Config/Menus.php(或从 examples 文件夹开始复制)并将您的菜单类添加到 $aliases
数组中。例如
class Menus extends \Tatter\Menus\Config\Menus
{
/**
* Menu class aliases.
*
* @var array<string, string>
*/
public $aliases = [
'main' => \App\Menus\MainMenu::class,
'fruit' => \ShopModule\FruitMenu::class,
];
}
一旦设置好别名,您就可以将它们作为参数传递给任何路由的 MenuFilter
$routes->add('shop/(:any)', 'ShopModule\ShopController::show/$1', ['filter' => 'menus:fruit']);
然后在您的视图或布局中放置一个双大括号中的占位符令牌,其中包含别名目标名称
<html>
<body>
{{main}}
<h1>Fruit Shop</h1>
{{fruit}}
...
注意,有时最好使用 app/Config/Filters.php 批量应用过滤器。遗憾的是,Config\Filters
中尚不支持参数,但您可以创建自己的特定于参数的过滤器来解决此问题
<?php namespace App\Filters;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Tatter\Menus\Filters\MenusFilter;
class MainMenuFilter extends MenusFilter
{
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null): ?ResponseInterface
{
return parent::after($request, $response, ['main', 'fruit']);
}
}
打包菜单
菜单
包含一些预制的菜单,可以立即使用或在此基础上构建以创建自己的变体。所有菜单都位于 Tatter\Menus\Menus
命名空间中,并扩展了 Menu
类,因此可以与过滤器一起使用或作为您创建的任何其他菜单使用。
面包屑
BreadcrumbsMenu
是一个特殊的菜单,使用水平风格的导航链接来处理嵌套内容。这个菜单已经为 Bootstrap 预先设置了样式,默认使用框架的 IncomingRequest::$uri
获取的段,但您可以使用静态方法 set
、get
、push
和 pop
提供自己的设置。此外,BreadcrumbsMenu::discover()
将尝试创建一个默认菜单。所有这些方法都使用 Breadcrumb
类,这是一个对 URL 和显示值的简单包装。例如
use Tatter\Menus\Breadcrumb;
use Tatter\Menus\Menus\BreadcrumbsMenu;
class Users extends Controller
{
public function show(int $userId)
{
// Get the User
$user = model('UserModel')->find($userId);
// Start with the default breadcrumbs
BreadcrumbsMenu::discover();
// Pop off the numeric last segment
BreadcrumbsMenu::pop();
// Replace it with the user's name
BreadcrumbsMenu::push(new Breadcrumb(current_url(), $user->name));
return view('users/show', ['user' => $user]);
}
}
... 如果您已设置过滤器,其余的将由系统为您处理。