Symfony 2 postUpdate在存储数据之前执行

时间:2015-09-03 07:53:31

标签: php symfony post-update

我现在在以下

中被困了一天

我在我的帐户实体上创建了一个监听器,它会监听prePersistpreUpdatepostPersistpostUpdate。我认为postUpdate是在数据存储到数据库后执行的,但现在我对此表示怀疑。

听众

/**
 * Account listener
 */
class AccountListener
{

    private $container;

    /**
     * Constructor
     *
     * @param ContainerInterface $container
     */
    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

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

        if ($entity instanceof Accounts) {
            $this->checkIfApiCallIsNeeded($entity, $args);
        }
    }

    /**
     * pre update
     *
     * @param LifecycleEventArgs $args
     */
    public function preUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Accounts) {
            $this->checkIfApiCallIsNeeded($entity, $args);
        }
    }

    /**
     * Post persist
     *
     * @param LifecycleEventArgs $args
     */
    public function postPersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Accounts) {
            $this->callApi($entity, $args);
        }
    }

    /**
     * Post update
     *
     * @param LifecycleEventArgs $args
     */
    public function postUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof Accounts) {
            $this->callApi($entity, $args);
        }
    }

    /**
     * Checks if a update should be send to the api and store the result in db
     * 
     * @param  Accounts           $account
     * @param  LifecycleEventArgs $args 
     */
    private function checkIfApiCallIsNeeded(Accounts $account, LifecycleEventArgs $args)
    {

        $importantProperties = array(
            'contactName',
            'address',
            'zipPostal',
            'city',
            'stateProvince',
            'country'
        );

        $callApi = 0;

        $uow = $args->getEntityManager()->getUnitOfWork();
        $changeset = $uow->getEntityChangeSet($account);

    /**
     * Check if one of the important properties has been changed 
     */
        foreach ($importantProperties as $property) {
            if (array_key_exists($property, $changeset)) {
                $callApi = 1;
            }
        }

        /**
         * Store in database
         */
        $account->setNeedUpdate($callApi);
    }

    /**
     * Update account to api
     *
     * @param Accounts $account
     */
    private function callApi(Accounts $account, LifecycleEventArgs $args)
    {
        $callApi = $account->getNeedUpdate();
        $accountId = $account->getId();

        if ($callApi === 1) {
            // Call the API
        }
    }
}

监听器应检查其中一个重要字段是否已更改,如果是,则应发送API请求(在帐户更新后)。但是,当我更新我的帐户时,看起来我的API中的操作仍然是旧帐户。

然后我在die(var_dump($account));函数内尝试callApi。结果是变量$account给了我更新的结果 实体就像我预期的那样。函数callApi()内的尚未将数据存储到数据库中! (我知道这是因为die(var_dump($account));的值与数据库中的值不相等)。因此,在这种情况下,我的API仍然可以从数据库中获取旧帐户。

我不知道为什么会发生这种情况,但对我而言,postUpdate函数完全执行后,数据会被存储。

我想知道为什么会发生这种情况,如果这是正常行为。我还想知道如何在数据存储到数据库后确保调用API。

1 个答案:

答案 0 :(得分:2)

postUpdate事件不会在flush()之后调用,而是在同花顺内部调用。这就是postFlush事件存在的原因(即使它不是生命周期回调)。

查看官方Doctrine 2 documentation chapter 9. Events

的更多信息