Symfony 2 Doctrine事件订阅者onFlush / PostFlush不会在外部捆绑中触发

时间:2016-09-28 13:29:55

标签: php symfony events doctrine-orm doctrine

当我想执行一些代码帖子与订阅者Flush时,我遇到了一个问题。当我更新实体时,我的on/post flush函数不会被执行。

我在symfony日志中没有错误(或其他任何内容),即使在我的事件中导致语法错误,也没有nginx / php日志中的任何内容。我重新启动了我的PHP并清除了我的缓存。

作为the symfony doc says for my symfony version (2.8),我做了以下内容:

MyBundle \ EventSubscriber \ MyEntityUpdatedEventSubscriber

<?php

namespace MyBundle\EventSubscriber;

use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\Common\EventSubscriber;

class MyEntityEventSubscriber implements EventSubscriber
{
    public function __construct(MySuperService $myService)
    {
        $this->myService = $myService;
    }

    public function getSubscribedEvents()
    {
        return array(
            'onFlush',
            'postFlush',
        );
    }

    public function onFlush(OnFlushEventArgs $args)
    {
        $uow = $args->getEntityManager()->getUnitOfWork();

        foreach ($uow->getScheduledEntityInsertions() as $entity) {
            // bla bla
        }
        //some interesting code
    }

    public function postFlush()
    {
        //Another interesting lines
    }
}

我的服务声明如下:

MyBundle /资源/配置/ service.yml

services:
    my_bundle.event.myentity_updated:
        class: MyBundle\EventSubscriber\MyEntityUpdatedEventSubscriber
        arguments:
            - @my_super_service
        tags:
            - { name: doctrine.event_subscriber, connection: default }

要完成,我的service.yml将加载到bundle dependency dependency extension中。

MyBundle \ DependencyInjection \ MyBundleExtension

[...]

    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
[...]

我的问题很简单:我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我注意到您已订阅onFlushpostFlush两个事件。如果您看到文档here,我就没有看到任何此类事件。

但是我总是使用以下活动,他们会满足我的所有要求。

/**
 * Hook to the events that need to be subscribed!!
 * @return array
 */
public function getSubscribedEvents()
{
    return array(
        'prePersist',
        'postPersist',
        'preUpdate',
        'postUpdate',
        'postDelete',
    );
}

还有一件事: 如果您的服务@my_super_service需要@doctrine.orm.entity_manager作为其参数之一,您可能会看到一些infinite dependency loop。刚提到我曾经面对过一次。