2016-09-28 3 views
0

У меня возникла проблема, когда я хочу выполнить некоторую доктрину постсоветского кода с помощью подписчика. Когда я обновляю объект, мои функции on/post flush не выполняются.Symfony 2 подписчики событий Doctrine onFlush/PostFlush не запускаются во внешнем пакете

У меня нет ошибок (или что-то еще) в журналах 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 загружается в расширение расширения зависимостей связки пакетов.

MyBundle \ внедрение зависимости \ 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'); 
    } 
[...] 

Мой вопрос прост: Я что-то отсутствует?

ответ

0

Я заметил, что вы подписаны на 2 события как onFlush и postFlush. Если вы видите документ 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. Только что упомянул, когда я столкнулся с ним один раз.

+0

Благодарим вас за ответ и ваш совет. Это список событий, выпущенных доктриной http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events. Мне нужно использовать эти события, но я попробовал «LifeCycle» (postUpdate) для тестирования. Это не входит в мою функцию вообще. Это похоже на то, что symfony не знает моего подписчика ... –

+1

Можете ли вы попробовать объявить конфигурацию своей службы в 'app/config/services.yml'? На всякий случай, 'Bundle dependancy injection' не запускает сервис. – Jeet

+0

Простите за эти две недели без ответа, у меня было много дел. Сегодня утром я вернулся к проблеме, и я только что увидел, что я не объявил свой внешний узел со слушателем в своем AppKernel ... Извините за пустую трату времени, я удалю этот вопрос сегодня днем, так как это не так. –

Смежные вопросы