簡體   English   中英

Symfony事件監聽器

[英]Symfony Event Listener

嗨,我想按照這個文檔做一個Symfony事件監聽器: http ://symfony.com/doc/2.8/cookbook/doctrine/event_listeners_subscribers.html

<?php

namespace FM\AppBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use FM\AdminBundle\Entity\Address\BillingAddress;

class BillingAdressListener
{
    /**
     * @param LifecycleEventArgs $args
     */
    public function listenBillingAdress(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if(!$entity instanceof BillingAddress){
            return;
        }

        $this->postPersist($args);
    }

    /**
     * @param LifecycleEventArgs $args
     */
    public function postPersist(LifecycleEventArgs $args)
    {
        $em = $args->getEntityManager();
        $billingAdress = $args->getEntity();

        dump($billingAdress); die();
    }
}

service.yml

billing_adress.listener:
        class: FM\AppBundle\EventListener\BillingAdressListener
        tags:
            - { name: doctrine.event_listener, event: listenBillingAdress }

但是當我使用BillingAddress對象提交表單時,什么也沒發生。

我做錯什么了嗎?

它在Doctrine中稱為Entity Listeners。 這是文檔

不要忘記在映射中添加實體偵聽器。 例如xml映射:

<entity name="AppBundle\Entity\AssignmentAttempt" table="app_assignment_attempt" >
    <entity-listeners>
        <entity-listener class="AppBundle\EntityListener\AssignmentAttemptListener">
            <lifecycle-callback type="prePersist" method="prePersist"/>
            <lifecycle-callback type="preUpdate" method="preUpdate"/>
        </entity-listener>
    </entity-listeners>
    <!-- Rest mapping -->
</entity>

在配置中,您可以簡單地添加

app.entity_listener.assignment_attempt:
     class: AppBundle\EntityListener\AssignmentAttemptListener
     tags:
         - { name: doctrine.orm.entity_listener }

我的壞,我不是做一個堅持,而是一個更新

它適用於堅持者

這是我現在的代碼:

<?php

namespace FM\AppBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use FM\AdminBundle\Entity\Address\BillingAddress;

class BillingAddressListener
{
    /**
     * @param LifecycleEventArgs $args
     */
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if(!$entity instanceof BillingAddress){
            return;
        }

        $this->addNameToUser($args);
    }

    /**
     * @param LifecycleEventArgs $args
     */
    public function addNameToUser(LifecycleEventArgs $args)
    {
        /** @var BillingAddress $billingAdress */
        $billingAdress = $args->getEntity();
        $user = $billingAdress->getOwner();

        if(empty($user->getFirstName())) $user->setFirstName($billingAdress->getFirstName());
        if(empty($user->getLastName())) $user->setLastName($billingAdress->getLastName());
    }
}

我必須調用prePersist方法。 我反其道而行之。

billing_address.listener:
    class: FM\AppBundle\EventListener\BillingAddressListener
    tags:
        - { name: doctrine.event_listener, event: prePersist }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM