为什么 Drupal 实体事件没有触发?
Why are Drupal Entity Events not firing?
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 types
被 created/updated/deleted 时触发。查看您的类名,我假设您想要 entity
事件。目前不可能使用 Drupal Core 和您尝试实现的事件组合来执行此操作。参考这个问题:https://www.drupal.org/project/drupal/issues/2551893你也可以试试票中提到的贡献模块,但我没有任何使用该模块的经验,所以里程可能会有所不同。
如果您想要实体事件,您将需要坚持使用旧的挂钩样式系统。
您正在寻找的钩子是:
- 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),这将确保您的事件被添加到列表的末尾。执行顺序可能意味着您正在破坏其他 modules/core 功能,因此请始终小心。
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events[EntityTypeEvents::CREATE][] = ['onCreate'];
$events[EntityTypeEvents::UPDATE][] = ['onUpdate'];
$events[EntityTypeEvents::DELETE][] = ['onDelete'];
return $events;
}
小代码nit,你也可以省略$events = [];
,因为它不需要声明一个空数组。
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 types
被 created/updated/deleted 时触发。查看您的类名,我假设您想要 entity
事件。目前不可能使用 Drupal Core 和您尝试实现的事件组合来执行此操作。参考这个问题:https://www.drupal.org/project/drupal/issues/2551893你也可以试试票中提到的贡献模块,但我没有任何使用该模块的经验,所以里程可能会有所不同。
如果您想要实体事件,您将需要坚持使用旧的挂钩样式系统。
您正在寻找的钩子是:
- 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),这将确保您的事件被添加到列表的末尾。执行顺序可能意味着您正在破坏其他 modules/core 功能,因此请始终小心。
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
$events[EntityTypeEvents::CREATE][] = ['onCreate'];
$events[EntityTypeEvents::UPDATE][] = ['onUpdate'];
$events[EntityTypeEvents::DELETE][] = ['onDelete'];
return $events;
}
小代码nit,你也可以省略$events = [];
,因为它不需要声明一个空数组。