2

背景资料

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

我正在构建一个 CMS,它将支持 pluginable "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因为它仍然会加载所有插件,但是如果数据库说它们被禁用/未安装,我根本不想加载这些插件。

4

1 回答 1

2

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

在加载任何插件之前,阅读 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);
}

确保 loadActive() 或任何你命名的方法返回一个匹配 CakePlugin::load() 期望的数组结构。

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

于 2013-08-13T16:49:32.333 回答