CakePHP中的动态插件加载

时间:2013-08-13 16:41:05

标签: php cakephp plugins

背景信息

在CakePHP v2.xx中(我使用的是v2.2.3),必须在app/Config/bootstrap.php中加载插件,如果您知道要加载哪些插件,这很好。

我正在构建一个CMS,它将支持可插入的"modules"。这当然导致我将模块构建为插件以进入app/Plugin并添加了一个名为Modules的子目录,将它们分组在(app/Plugin/Modules/)中,再次没问题。但是,为了动态地加载这些负载(模块在启用/禁用安装/卸载等方面可以控制),我必须从引导程序扫描目录,因为此时数据库访问不可用。虽然文件夹中存在文件夹,但仍会加载禁用的插件。

主要问题

有没有办法有效加载某个文件夹中找到的所有插件(最好使用数据库信息) - 我不想运行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建议,因为它仍然加载所有插件,但是如果数据库说它们被禁用/未安装,我根本不想加载插件。 / p>

1 个答案:

答案 0 :(得分:2)

  

如何从app / Plugin / Modules(自定义插件)加载所有插件   子文件夹)

Read the doc block of App::build()并在加载任何插件之前在bootstrap.php中调用它。将自定义路径添加到插件路径。

  

我可以以某种方式从app / Config / bootstrap.php中查询模型   帮助加载自定义插件列表

App::uses('ClassRegistry', 'Utility');
$Module = ClassRegistry::init('Module');
$modules = $Module->loadActive();
foreach ($modules as $module) {
    CakePlugin::load($module);
}

确保loa​​dActive()或您为方法命名的任何内容都返回一个与CakePlugin :: load()所期望的匹配的数组结构。

更新了修复有关loadAll()vs load()的部分的问题。