namespace Drupal\ta3mal_utilities\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Drupal\Core\Entity\EntityTypeEvents;
use Drupal\Core\Entity\EntityTypeEvent;
class EntityEvents implements EventSubscriberInterface {
public function onCreate(EntityTypeEvent $event) {
//Do things on creation
}
public function onUpdate(EntityTypeEvent $event) {
dd('on update now');
}
public function onDelete(EntityTypeEvent $event) {
//Do things on delete
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events = [];
$events[EntityTypeEvents::CREATE][] = ['onCreate', 1];
$events[EntityTypeEvents::UPDATE][] = ['onUpdate', 1];
$events[EntityTypeEvents::DELETE][] = ['onDelete', 1];
return $events;
}
}
我也将其包含在服务文件中,调用了 getSubscribedEvents 但它没有到达更新的事件,有什么帮助吗? 谢谢。
最佳答案
创建/更新/删除实体类型
时会触发
EntityTypeEvents::XXX
。看看你的类名,我假设你想要 entity
事件。目前,使用 Drupal Core 和您尝试实现的事件组合无法做到这一点。引用此问题:https://www.drupal.org/project/drupal/issues/2551893您也可以尝试票证中提到的贡献模块,但我对该模块没有任何经验,因此里程可能会有所不同。
如果您想要实体事件,您将需要坚持使用旧的钩子(Hook)样式系统。
您正在寻找的 Hook 是:
- hook_entity_update
- hook_entity_delete
- hook_entity_create/hook_entity_insert(取决于您想要执行的操作)
Drupal 文档中的完整引用:https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21entity.api.php/8.8.x
我注意到的另一件事可能会在将来实现事件监听器时对您有所帮助,那就是您以优先级 1 声明了所有订阅事件。这可能是您在层次结构中将优先级设置得太高了。如果您不需要在任何其他 Drupal 模块或核心功能之前明确执行代码,我会忽略优先级并将其留空,以便使用默认值 (0),这将确保您的事件被添加到列表的末尾。执行顺序可能意味着您会破坏其他模块/核心功能,因此请务必小心。
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events[EntityTypeEvents::CREATE][] = ['onCreate'];
$events[EntityTypeEvents::UPDATE][] = ['onUpdate'];
$events[EntityTypeEvents::DELETE][] = ['onDelete'];
return $events;
}
小代码,您也可以省略 $events = [];
,因为不需要声明空数组。
关于symfony - 为什么 Drupal 实体事件没有触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61405528/