zieglerh/pimcore-event-manager

通过PHP属性在EventSubscribers中绑定事件

安装: 193

依赖项: 0

建议者: 0

安全: 0

星级: 1

观察者: 1

分支: 0

开放问题: 0

类型:pimcore-bundle

v1.0 2024-03-10 22:55 UTC

This package is auto-updated.

Last update: 2024-09-13 23:31:27 UTC


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使缓存无效并重新构建。