CakePHP中的动态插件加载



背景信息

在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()的部分。

最新更新