zieglerh / pimcore-event-manager
通过PHP属性在EventSubscribers中绑定事件
v1.0
2024-03-10 22:55 UTC
Requires
- php: ^8.0
- pimcore/pimcore: ^11.0
- symfony/dependency-injection: ^6.0
Requires (Dev)
README
无需配置,仅通过函数参数通过PHP属性标签订阅事件
安装
Composer
composer require zieglerh/pimcore-event-manager-bundle:^1.0
好处
- 使用PHP属性简单定义EventSubscribers
- 仅订阅使用的事件
- 通过symfony构建缓存进行缓存
用法
- 创建一个EventSubscriber类并实现
EventManagerBundle\EventSubscriber\EventSubscriberInterface
- 确保你的类文件夹在services.yml中定义
- 在类中使用
EnabledTrait
- 创建一个函数并定义具有一个或多个事件的功能属性
- 函数参数可以是事件主题或事件对象
#[Event(DocumentEvents::PRE_ADD)] #[Event(DocumentEvents::PRE_UPDATE)] public function check(Document\Link $link): void
为了加快批量任务,您可以通过静态函数在任何地方启用和禁用EventSubscriber。
示例
数据对象
<?php namespace App\EventSubscriber; use EventManagerBundle\Event\Event; use EventManagerBundle\EventSubscriber\EnabledTrait; use EventManagerBundle\EventSubscriber\EventSubscriberInterface; use Pimcore\Event\DataObjectEvents; use Pimcore\Model\DataObject\MyModel; /** * Class MyModelSubscriber * * @package App\EventSubscriber */ class MyModelSubscriber implements EventSubscriberInterface { use EnabledTrait; /** * @param MyModel $object * * @return void * @throws \JsonException */ #[Event(DataObjectEvents::PRE_UPDATE)] #[Event(DataObjectEvents::PRE_ADD)] public function doSomething(MyModel $object): void { // implementation } }
事件参数
带有$event示例的文档
<?php namespace App\EventSubscriber; use EventManagerBundle\Event\Event; use EventManagerBundle\EventSubscriber\EnabledTrait; use EventManagerBundle\EventSubscriber\EventSubscriberInterface; use Pimcore\Event\DocumentEvents; use Pimcore\Model\Document; use Pimcore\Event\Model\DocumentEvent; /** * Class DocumentSubscriber * * @package App\EventSubscriber */ class DocumentSubscriber implements EventSubscriberInterface { use EnabledTrait; /** * @param Document\Link $link * * @return void */ #[Event(DocumentEvents::PRE_ADD)] #[Event(DocumentEvents::PRE_UPDATE)] public function doSomething(Document\Link $link, DocumentEvent $event): void { // implementation } }
任何事件
基本上是*Events.php类中的任何事件
// e.g. vendor/pimcore/pimcore/lib/Event/UserRoleEvents.php /** * @Event("Pimcore\Event\Model\UserRoleEvent") * * @var string */ const PRE_ADD = 'pimcore.user.preAdd'; // from @Event docblock you can see, it will fire a UserRoleEvent // ... // inside \Pimcore\Model\User\AbstractUser::save() // you will see $this->dispatchEvent(new UserRoleEvent($this), UserRoleEvents::PRE_UPDATE); // you can use either User or Role or UserRole or Folder class as function argument // and optional UserRoleEvent as event argument
多个类
您可以将多个对象中的逻辑组合起来
#[Event(DocumentEvents::PRE_UPDATE)] public function doSomething(User|Role|UserRole $object): void { // implementation }
事件参数
默认情况下,autosave和save version only事件不由EventSubscriber处理。这与Pimcore的默认行为相反。
如果您需要,也必须将属性添加到函数中。
#[IsAutoSave] #[SaveVersionOnly] #[Event(DataObjectEvents::PRE_ADD)] public function doSomething(MyModel $object): void { // implementation }
解决问题
良好实践
- 在批量导入或保存时,禁用()订阅者,然后进行批量更新
- 使用symfony消息队列在后台启动任务
常见错误
- 确保您的订阅者函数是公开的
调试
- 当您想调试该捆绑包时,您必须更改一个类,以便symfony使缓存无效并重新构建。