背景信息
在CakePHP v2.xx(我使用的是v2.2.3)中,插件必须在app/Config/bootstrap.php
中加载,如果你知道要加载哪些插件,这很好。
我正在构建一个CMS,它将支持可插入的"modules"
。这当然让我将模块构建为插件,以进入app/Plugin
,并添加了一个名为Modules
的子目录,将它们分组在(app/Plugin/Modules/
)中,这也很好。然而,为了动态加载这些模块(模块在启用/禁用安装/卸载等方面是可控的),我必须从引导程序中扫描目录,因为此时数据库访问不可用。尽管如果文件夹中存在文件夹,这仍然会加载禁用的插件。
主要问题
有没有一种方法可以有效地加载在某个文件夹中找到的所有插件(最好使用DB信息)-我不想运行CakePlugin::loadAll()
,除非我能指定它应该从app/Plugin
中的哪个文件夹加载它们(从我在文档中读到的内容来看,这似乎是不可能的)。
简化
- 如何从
app/Plugin/Modules
(自定义插件子文件夹)加载所有插件 - 我可以从
app/Config/bootstrap.php
中查询一个模型来帮助加载自定义插件列表吗
更新:-分辨率
感谢burzum的回答——这并不是我所需要的,但非常接近,我用他的代码整理出了我的答案。对于任何未来的访客,我的最终代码如下:
App::uses('ClassRegistry','Utility');
$Module = ClassRegistry::init('Module');
$activeModules = $Module->loadActive();
foreach($activeModules as $mod)
{
CakePlugin::load($mod);
}
注意:我没有使用burzum关于loadAll
的建议,因为它仍然加载所有插件,但如果数据库显示插件已禁用/未安装,我根本不想加载这些插件。
如何从应用程序/插件/模块加载所有插件(自定义插件子文件夹)
在加载任何插件之前,请阅读App::build()的doc块并在bootstrap.php中调用它。将您的自定义路径添加到插件路径中。
我可以在app/Config/bootstrap.php中查询模型吗以帮助加载插件的自定义列表
App::uses('ClassRegistry', 'Utility');
$Module = ClassRegistry::init('Module');
$modules = $Module->loadActive();
foreach ($modules as $module) {
CakePlugin::load($module);
}
请确保loadActive()或您为方法命名的任何方法返回的数组结构与CakePlugin::load()所期望的相匹配。
更新了问题以修复关于loadAll()与load()的部分。