我有一个非常基本的应用程序,它使用插件来实现大部分功能。我想允许每个插件定义一些自定义菜单和菜单项,将所有这些菜单收集在一个地方(可能是 AppController::initialize),并创建一个数组,该数组将传递给 main-menu.php 元素,该元素将呈现完整的菜单。
到目前为止我所做的是定义插件中的菜单
# plugins/TestPlugin/config/menus.php
return [
'menus' => [
[
'header' => 'TestPlugin',
[
'title' => 'Click me!',
'href' => './',
],
[
'title' => 'Click me too!',
'href' => './',
]
]
]
];
加载配置:
# plugins/TestPlugin/config/bootstrap.php
use Cake\Core\Configure;
Configure::load('TestPlugin.menus', 'default' , true);
并读取变量:
# src/Controller/AppController.php
public function initialize()
{
parent::initialize();
$plugin_menus = Configure::read('menus);
但是如果我有多个插件,
menus
就会被覆盖。
我不确定这是否是最好的方法。我试图实现的是让多个模块更改(附加)相同的配置变量
如果是我,我会使用 View Cell 来生成导航。
在每个插件
bootstrap.php
文件内,我会将插件附加到 Configure
变量以添加其导航。
Configure::write('navigation', array_merge(Configure::read('navigation'), $myNavArray);
然后在导航视图单元格中,我可以处理该
Configure
变量。
foreach (Configure::read('navigation') as $navItem) {
// Build nav, or output, etc
}
这样做的优点是,由于视图单元,您的导航在任何地方都是相同的。您还将拥有一个 View Cell 控制器,这意味着您可以对导航执行更多操作,例如在输出导航项之前检查权限。
通过挂钩引导程序,您还可以灵活地包含或不包含插件导航,只需不加载引导程序,而不是先检查插件设置。