当从数据库中保存/更改/删除对象时,Typo3 12.4 中会调度哪个事件?

问题描述 投票:0回答:1

我有一个数据结构,包括模型

product
version
,每个
product
可以连接到多个
version
version
有一个数据点
size
。在网页上,我们希望为每个
product
显示
maximum_size
,即所有连接的
version
的最大尺寸。

在 Typo3 12.4 中有效实现这一点的想法如下:

  • 将属性
    maximum_size
    包含在
    product
    的数据模型中,根据现有的
    version
    计算并保存值。
  • 监听每当一个
    version
    对象被保存、更新或从数据库中删除时调度的事件。
  • 在这种情况下,找到与新的/更新的/删除的
    product
    连接的
    version
    并重新计算并保存
    maximum_size
    的值。

是否有已经适合此应用程序的 Typo3 PSR-14 事件?

特别是,根据我对文档的理解,这些将是候选者:

  • \TYPO3\CMS\Extbase\Event\Persistence\EntityPersistedEvent
  • \TYPO3\CMS\Extbase\Event\Persistence\EntityUpdatedInPersistenceEvent
  • \TYPO3\CMS\Extbase\Event\Persistence\EntityRemovedFromPersistenceEvent

我已经尝试过第一个,但似乎不起作用:

以下https://docs.typo3.org/m/typo3/reference-coreapi/12.4/en-us/ExtensionArchitecture/HowTo/Events/Index.html

  1. 在我的扩展中创建一个事件监听器类
# Classes/EventListener/ProductMaximumSizeUpdater.php

<?php

declare(strict_types=1);

namespace MyVendor\MyExtension\EventListener;

use \TYPO3\CMS\Extbase\Event\Persistence\EntityPersistedEvent;

use \Psr\Log\LoggerInterface;

final class ProductMaximumSizeUpdater
{
    public function __construct(
        private readonly LoggerInterface $logger,
    ) {}
    
    public function __invoke(EntityPersistedEvent $event): void
    {
        $entity = $event->getObject();
        $this->logger->info('test message');
    }
}
  1. 在我的分机中注册活动
# Configuration/Services.yaml

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false
  
  MyVendor\MyExtension\EventListener\ProductMaximumSizeUpdater:
    tags:
      - name: event.listener
        identifier: 'productMaximumSizeUpdater'
  1. 我已经配置了 LoggingInterface,以便它将信息日志从我的 EventListener 写入到
    /var/log/ReplicareWiwaEventListener.log
    :
$GLOBALS['TYPO3_CONF_VARS']['LOG']['MyVendor]['MyExtension']['EventListener']['writerConfiguration'] = [
    \TYPO3\CMS\Core\Log\LogLevel::INFO => [
        \TYPO3\CMS\Core\Log\Writer\FileWriter::class => [
            'logFile' => \TYPO3\CMS\Core\Core\Environment::getVarPath() . '/log/MyEventListener.log'
        ]
    ]
];

有了这个,我希望每当创建一个新对象并将其保存在网页后端的数据库中时,都会将信息记录到

/var/log/MyEventListener.log
。但实际上,日志文件甚至还没有创建(意味着根本没有日志记录)。

我对如何实现EventListener有什么误解吗?还是

EntityPersistedEvent
不适合在这里使用?

events typo3 event-listener extbase typo3-12.x
1个回答
0
投票

您好,了解 TYPO3 前端和后端使用不同的方法来保存数据很重要。

后端使用数据处理程序使用经典的钩子https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Events/Hooks/Index.html所以你不会立即查找与此相关的任何活动。

甚至在 Frotenend 中,持久数据也有不同的可能性。大多数现代扩展都使用 Extbase,它带有自己的 ORM 逻辑并触发您在问题中提到的事件。

但扩展也可能使用 Querybuilder 或其他数据库类。直接修改数据。因此,要捕获“所有”更新,您需要知道扩展的范围。编辑是否只发生在后端 -> 它最有可能的数据处理程序挂钩在前端的事件中。如果两者都需要处理两者的逻辑。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.