繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM