php之Symfony onFlush 学说监听器

Terrylee 阅读:87 2025-01-19 22:14:33 评论:0

您好,我有一个 onFlush 监听器:

<?php 
 
namespace FM\AppBundle\EventListener; 
 
use FM\AdminBundle\Entity\Address\DeliveryAddress; 
use Doctrine\ORM\Event\OnFlushEventArgs; 
 
class DeliveryAddressListener 
{ 
    /** 
     * @param OnFlushEventArgs $args 
     */ 
    public function onFlush(OnFlushEventArgs $args) 
    { 
        $em = $args->getEntityManager(); 
        $uow = $em->getUnitOfWork(); 
 
        foreach ($uow->getScheduledEntityUpdates() as $entity) { 
            if ($entity instanceof DeliveryAddress) { 
                $this->addPostalToUser($entity, $args); 
            } 
        } 
    } 
 
    /** 
     * @param DeliveryAddress  $deliveryAddress 
     * @param OnFlushEventArgs $args 
     */ 
    public function addPostalToUser(DeliveryAddress $deliveryAddress, OnFlushEventArgs $args) 
    { 
        $em = $args->getEntityManager(); 
        $user = $deliveryAddress->getOwner(); 
 
        $user->setPostalCode($deliveryAddress->getZipCode()); 
    } 
} 

service.yml:

delivery_address.listener: 
    class: FM\AppBundle\EventListener\DeliveryAddressListener 
    tags: 
        - { name: doctrine.event_listener, event: onFlush } 

我正在尝试为用户设置新的邮政编码。但它似乎不起作用。

即使我正在添加 $em->persist($user)

我正在查看此文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#onflush

但我不明白如何才能使它与这个解释一起工作:

如果你在 onFlush 中创建并持久化一个新实体,那么调用 EntityManager#persist() 是不够的。您必须执行对 $unitOfWork->computeChangeSet($classMetadata, $entity) 的额外调用。

请您参考如下方法:

在操作字段时,应该在 preUpdaet/prePersist 中完成。

AppBundle/EventSubscriber/EntitySubscriber.php

namespace AppBundle\EventSubscriber; 
 
use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\LifecycleEventArgs; 
use Doctrine\ORM\Event\OnFlushEventArgs; 
 
class EntitySubscriber implements EventSubscriber 
{ 
    private $now; 
 
    public function __construct() 
    { 
        $this->now = \DateTime::createFromFormat('Y-m-d h:i:s', date('Y-m-d h:i:s')); 
    } 
 
    public function getSubscribedEvents() 
    { 
        return [ 
            'prePersist', 
            'preUpdate' 
        ]; 
    } 
 
    public function prePersist(LifecycleEventArgs $args) 
    { 
        $entity        = $args->getEntity(); 
        $entityManager = $args->getEntityManager(); 
 
        if (method_exists($entity, 'setCreatedAt')) { 
            $entity->setUpdatedAt($this->now); 
        } 
 
        if (method_exists($entity, 'setUpdatedAt')) { 
            $entity->setUpdatedAt($this->now); 
        } 
    } 
 
    public function preUpdate(LifecycleEventArgs $args) 
    { 
        $entity        = $args->getEntity(); 
        $entityManager = $args->getEntityManager(); 
 
        if (method_exists($entity, 'setUpdatedAt')) { 
            $entity->setUpdatedAt($this->now); 
        } 
    } 
} 

services.yml

    app.entity_subscriber: 
        class: AppBundle\EventSubscriber\EntitySubscriber 
        tags: 
            - { name: doctrine.event_subscriber, connection: default } 


标签:PHP
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号