我有一个数据结构,包括模型
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
我已经尝试过第一个,但似乎不起作用:
# 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');
}
}
# Configuration/Services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
public: false
MyVendor\MyExtension\EventListener\ProductMaximumSizeUpdater:
tags:
- name: event.listener
identifier: 'productMaximumSizeUpdater'
/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
不适合在这里使用?
您好,了解 TYPO3 前端和后端使用不同的方法来保存数据很重要。
后端使用数据处理程序使用经典的钩子https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Events/Hooks/Index.html所以你不会立即查找与此相关的任何活动。
甚至在 Frotenend 中,持久数据也有不同的可能性。大多数现代扩展都使用 Extbase,它带有自己的 ORM 逻辑并触发您在问题中提到的事件。
但扩展也可能使用 Querybuilder 或其他数据库类。直接修改数据。因此,要捕获“所有”更新,您需要知道扩展的范围。编辑是否只发生在后端 -> 它最有可能的数据处理程序挂钩在前端的事件中。如果两者都需要处理两者的逻辑。