现在使用 symfony 6.4,我试图将我的服务定义(.yml)中的一些内容转换为 php 属性。 我正在做的是删除 EntityListener 的服务定义并将其替换为相应的 PHP 属性。
它适用于 preUpdate 事件,但 postFlush 从未被调用...我做错了什么?
使用前.yml:
App\Listener\Task\TaskCompletedListener:
tags:
- { name: doctrine.event_listener, event: postFlush }
- { name: doctrine.event_listener, event: preUpdate }
在我的 Listener class.php 中之后
<?php
namespace App\Listener\Task;
use App\Entity\Task\Task;
use App\Entity\Task\TaskUserLog;
use App\Entity\User\User;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsEntityListener;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
#[AsEntityListener(event: Events::preUpdate, method: 'preUpdate', entity: Task::class)]
#[AsEntityListener(event: Events::postFlush, method: 'postFlush', entity: Task::class)]
class TaskCompletedListener
{
private $taskUserLog=null;
private TokenStorageInterface $tokenStorage;
public function __construct(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
public function preUpdate(Task $task, PreUpdateEventArgs $args){
if($args->hasChangedField('lastCompletionDate')){
//Log new entry to see who did the task
$taskUserLog=new TaskUserLog();
/** @var User $user */
$user=$this->tokenStorage->getToken()->getUser();
$taskUserLog->setUser($user);
$taskUserLog->setTask($task);
$this->taskUserLog=$taskUserLog;
}
}
/**
* @param Task $task
* @param PostFlushEventArgs $event
*/
public function postFlush(Task $task, PostFlushEventArgs $event)
{
if(!is_null($this->taskUserLog)) {
$em = $event->getObjectManager();
$em->persist($this->taskUserLog);
$this->taskUserLog=null;
$em->flush();
}
}
}
我认为 symfony 文档足够清晰,更改也很简单,但我不知道为什么它不起作用。每堂课只有一次活动吗?
https://symfony.com/doc/current/doctrine/events.html#:~:text=%24event%20argument).-,Doctrine%20Entity%20Listeners,是%20modified%20in%20the%20database。
单独调用postFlush事件而不调用preUpdate是否被调用?
您还可以在
doctrine:orm:
文件下显示 config/packages/doctrine.yaml
设置吗?谢谢