[英]CakePHP 3.x: how to implement event listener in plugin / plugins src-directory doesn't get loaded
为了用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);
...(在plugins/MyPlugin/src/Lib
中有一个类Tester
)会导致错误。 在第一行中找不到侦听器类( “Error: Class 'Lib\\Tester' not found”
)。 并且在第二行$this
不能在bootstrap.php
的上下文中“Error: Using $this when not in object context”
( “Error: Using $this when not in object context”
)。
在一个旧的线程( 在哪里注册事件监听器 ),其他人要求同样的事情并得到一个非常详细的答案。 不过,它适用于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表上建立一个基本请求并将其发送到几个插件。 然后插件可以丰富连接特殊表或类似的表的请求。
所以,还有一个问题:如何避免在bootstrap.php
使用__DIR__
? 如何正确地实例化侦听器?
[更新#2]
好像我的插件的完整src
子目录不是导入路径的一部分。 我放在那里的类都没有被加载。 这意味着当我在那里放置一个时,CakePHP找不到简单的控制器。
我一般做错了吗? 或者可能是CakePHP中的错误?
不幸的是我也找不到CakePHP 3.x的插件,其源代码可以帮助我理解我可能做错的事情。
...正如ndm在上面的注释中假设的那样,我在composer.json
文件中手动插入的部分出了问题。 修复dumpautoload
并再次运行dumpautoload
,所有类都会被加载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.