CakePHP 3.x : how to implement event listener in plugin/plugins src-directory doesn't get loaded

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

为了使用 CakePHP 构建一个可扩展的博客系统,我想在 Wordpress 中实现类似扩展 Hook 的功能。我的计划是使用基本 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)会导致错误。 在第一行中找不到监听器类(“错误:未找到类 'Lib\Tester'”)。并且在第二行中 $this 不得在 bootstrap.php 的上下文中使用(“错误:不在对象上下文中时使用 $this”).

在一个旧线程( 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);

这样我现在就可以在文章表上构建基本请求并将其发送到多个插件。然后插件可以丰富加入特殊表或类似内容的请求。

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

[更新#2]

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

我总体上做错了什么吗?或者这可能是 CakePHP 中的一个错误?

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

最佳答案

...正如上面评论中的 ndm 所假设的那样,我在 composer.json 文件中手动插入的部分出现了问题。修复该问题并再次运行 dumpautoload 后,所有类都会被加载。

关于CakePHP 3.x : how to implement event listener in plugin/plugins src-directory doesn't get loaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36552632/

相关文章:

validation - CakePHP 验证不起作用

php - 使用 CakePHP 进行负载平衡和 session 管理

javascript - 表单事件 'actioncomplete' 未触发

php - 点击加载更多 WordPress 帖子

java - 在 Java Rundeck Plugin 中添加对 jar 的依赖

php - 文件未在 cakephp 中使用 Ajax 上传

CakePHP - loginAction 的绝对 URL

javascript - 当 Flash 小程序失去焦点时,如何在 JavaScript 中捕获该事件?

java - 在 java 中通过架构层向上冒泡事件

plugins - 如何配置 cargo 将项目构建到特定目录?