Mam zdarzenie onFlush(), które działa poprawnie, ale muszę to zrobić, aby obrócić je do funkcji preFlush() lub preUpdate(), które są akceptowalne. Zrobiłem preFlush(), ale z jakiegoś powodu nic nie robi. Nawet nie błąd. czego mi brakuje?Tworzenie zdarzenia preUpdate lub preFlush za pomocą detektora zdarzeń
TEST: Umieściłem exit
w preFlush()
, aby sprawdzić, czy jest w ogóle wywoływany. Wynik: , więc foreach()
nigdy nie jest uruchamiany! Jest to pusta tablica. Przetestowałem również preUpdate() i wszystkie linie w tym run got, ale nie dane wstawione.
public function preFlush(PreFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
echo '1';
foreach ($uow->getScheduledEntityUpdates() as $entity) {
echo '2';
if ($entity instanceof User) {
echo '3';
}
}
exit;
}
Stworzyłem je po przeczytaniu documentation.
service.yml
services:
entity.event_listener.user:
class: Site\FrontBundle\EventListener\Entity\UserListener
tags:
- { name: doctrine.event_listener, event: preUpdate }
- { name: doctrine.event_listener, event: onFlush }
- { name: doctrine.event_listener, event: preFlush }
robocza onFlush() przykład:
class UserListener
{
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $entity) {
if ($entity instanceof User) {
$userLog = new UserLog();
$userLog->setDescription($entity->getId() . ' being updated.');
$em->persist($userLog);
// Instead of $em->flush() cos we're already in flush process
$userLogMetadata = $em->getClassMetadata(get_class($userLog));
$uow->computeChangeSet($userLogMetadata, $userLog);
}
}
}
}
Nie działa preFlush() przykład:
class UserListener
{
public function preFlush(PreFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityUpdates() as $entity) {
if ($entity instanceof User) {
$userLog = new UserLog();
$userLog->setDescription($entity->getId() . ' being updated.');
$em->persist($userLog);
// Instead of $em->flush() cos we're already in flush process
$userLogMetadata = $em->getClassMetadata(get_class($userLog));
$uow->computeChangeSet($userLogMetadata, $userLog);
}
}
}
}
Nie działa preUpdate() przykład
class UserListener
{
public function preUpdate(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
if ($entity instanceof User) {
$userLog = new UserLog();
$userLog->setDescription($entity->getId() . ') been updated.');
$em = $args->getEntityManager();
$em->persist($userLog);
$userLogMetadata = $em->getClassMetadata(get_class($userLog));
$uow->computeChangeSet($userLogMetadata, $userLog);
}
}
}
Czy możesz dodać część konfiguracji usługi? – devsheeep
@devsheeep - Zaktualizowano wpis dla tego. – BentCoder
Czy możesz pokazać kod, w którym nazywasz metody utrwalania i płukania? – aimar