CakePHP 3.x:如何在plugin/plugins src目录下实现事件监听器;不要上膛

CakePHP 3.x:如何在plugin/plugins src目录下实现事件监听器;不要上膛,cakephp,events,plugins,cakephp-3.0,cakephp-3.x,Cakephp,Events,Plugins,Cakephp 3.0,Cakephp 3.x,为了用CakePHP构建一个可扩展的博客系统,我想在Wordpress中实现一些类似于扩展挂钩的东西。我的计划是使用基本SQL在主应用程序中加载文章。这个SQL应该可以通过一组可变的插件(每个特殊的文章类型对应一个插件)进行扩展 我已经知道CakePHP实现类似功能的方法是事件系统。不过,我在注册驻留在插件中的侦听器时遇到了一些问题 官方文档(3.x Book;)说,可以通过以下方式注册侦听器: // Attach the UserStatistic object to the Order's

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

我已经知道CakePHP实现类似功能的方法是事件系统。不过,我在注册驻留在插件中的侦听器时遇到了一些问题

官方文档(3.x Book;)说,可以通过以下方式注册侦听器:

// 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
)会导致错误。 在第一行中找不到侦听器类(
“错误:找不到类'Lib\Tester'”
)。在第二行中,
$this
不能在
bootstrap.php
的上下文中使用(
“错误:不在对象上下文中使用$this”

在一个旧线程()中,有人问了同样的问题,得到了非常详细的答案。不过,它是针对CakePHP2.x的,不再适用于CakePHP3.x。例如,cakephp3.x中不存在函数
App::uses
,我找不到替代函数

那么:有人能帮我找到在CakePHP3.x中的插件中设置工作侦听器的正确方法吗

[更新#1]

我找到了一个适合我的解决办法(但很难看)。在插件的
bootstrap.php
中,我能够实例化事件侦听器类的一个对象,如下所示:

require __DIR__ . '/../src/Lib/Tester.php';
$tester = new MyPlugin\Lib\Tester();
之后,我可以在文章模型上注册侦听器(当然也可以在
bootstrap.php
中注册):

这样,我现在可以在articles表上建立一个基本请求,并将其发送到几个插件。然后,插件可以丰富加入特殊表或类似内容的请求

因此,还有一个问题:如何避免在
bootstrap.php
中使用
\uuuuu DIR\uuuuu
?如何正确实例化侦听器

[更新#2]

我的插件的complete
src
子目录似乎不是导入路径的一部分。我放在那里的类没有一个被加载。这意味着当我在那里放置一个简单的控制器时,CakePHP找不到一个简单的控制器

我总的来说做错了什么吗?或者这可能是CakePHP中的一个bug


不幸的是,我都找不到CakePHP 3.x的插件,它们的源代码可以帮助我理解我可能会做错什么。。。正如ndm在上面的评论中所假设的那样,我在
composer.json
文件中手动插入的部分有问题。在修复该问题并再次运行
dumpautoload
之后,所有类现在都被加载。

您阅读并遵循了吗?是的,当然。不过,我并没有使用bake创建(当前)插件。但这应该是可选的,不是吗?[编辑:]以前尝试过烘焙…这是可选的,是的,但需要您手动设置自动加载。一般来说,这听起来像是一个自动加载的问题,但我真的不能告诉你什么,除了链接的文档。如果你遵循了它,但它仍然不起作用,而手动加载文件却起作用(即没有权限问题),那么我就有点难堪了。是的,你的想法是对的。事实上,我在应用程序的
composer.json
文件中犯了一个错误(修正后,再次运行
dumpautoload
,它现在可以工作了。我无法解释为什么我以前使用bake的示例也不起作用。但这并不重要。非常感谢!
Cake\ORM\TableRegistry::get('Articles')->eventManager()->on($tester);