CakePHP 3.x:如何在插件/插件中实现事件监听器src-directory没有加载

时间:2016-04-11 15:13:07

标签: cakephp events plugins cakephp-3.0 cakephp-3.x

为了使用CakePHP构建一个可扩展的博客系统,我想在Wordpress中实现类似扩展钩子的东西。我的计划是使用基本SQL来加载主应用程序中的文章。这个SQL应该可以通过一组可变插件扩展(每种特殊文章类型都有一个插件)。

我已经知道CakePHP实现类似事情的方式是事件系统。但是,我在注册驻留在我的插件中的监听器时遇到了一些麻烦。

官方文档(3.x Book; http://book.cakephp.org/3.0/en/core-libraries/events.html#registering-listeners)说,听众可以这样注册:

// Attach the UserStatistic object to the Order's event manager
$statistics = new UserStatistic();
$this->Orders->eventManager()->on($statistics);

不幸的是,它没有告诉放置此代码的位置,以便在引导时自动注册侦听器。将以下行放在我的插件bootstrap.php中,如下所示:

$tester = new Lib\Tester();
$this->Orders->eventManager()->on($tester);

...(当然在Tester中有一个班级plugins/MyPlugin/src/Lib)会导致错误。 在第一行中找不到侦听器类(“Error: Class 'Lib\Tester' not found”)。在第二行中$this不得在bootstrap.php“Error: Using $this when not in object context”)的上下文中使用。

在一个旧线程(Where to register event listeners)中,其他人要求同样的事情并得到一个非常详细的答案。不过,它适用于CakePHP 2.x,并且不再适用于CakePHP 3.x.例如,CakePHP 3.x中不存在函数App::uses,我找不到替换函数。

所以:有人可以帮我找到在CakePHP 3.x中的插件中设置工作监听器的正确方法吗?

[更新#1]

我找到了适用于我的解决方法(但非常难看)。在插件的bootstrap.php中,我能够实例化我的事件监听器类的对象:

require __DIR__ . '/../src/Lib/Tester.php';
$tester = new MyPlugin\Lib\Tester();

之后我可以在Articles模型上注册监听器(当然也在bootstrap.php中):

Cake\ORM\TableRegistry::get('Articles')->eventManager()->on($tester);

这样我现在就能够在articles表上建立一个基本请求并将其发送到几个插件。然后插件可以丰富连接特殊表或类似的表的请求。

所以,还有一个问题:如何避免在__DIR__中使用bootstrap.php?如何正确地实例化侦听器?

[更新#2]

好像我的插件的完整src子目录不是导入路径的一部分。我放在那里的类都没有被加载。这意味着CakePHP在我放置一个简单的控制器时找不到它。

我一般做错了吗?或者可能是CakePHP中的错误?

不幸的是我也找不到CakePHP 3.x的插件,其源代码可以帮助我理解我可能做错的事情。

1 个答案:

答案 0 :(得分:0)

...如上面的评论中假设 ndm ,我在composer.json文件中手动插入的部分出错了。修好并再次运行dumpautoload之后,现在所有类都被加载了。