Symfony2 Event_listener не запускается - PullRequest
2 голосов
/ 14 марта 2012

Я использую Symfont RC5 и пытаюсь запустить прослушиватель событий prePersist.

В app/config/config.yml У меня есть: -

services:
   recordmanagement:
      class: FNQITServices\BMBundle\Listener\RecordManagement
      tags:
        - { name: doctrine.event_listener, event: prePersist }

И я создал класс src/FNQITServices/BMBundle/Listener/RecordManagement.php: -

<?php
namespace FNQITServices\BMBundle\Listener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use FNQITServices\BMBundle\Entity\Elections;
use FNQITServices\BMBundle\Entity\People;

class RecordManagement
{
    public function prePersist(LifecycleEventArgs $args)
    {
        `echo "amibeingcalled" > /tmp/test`;

        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        // perhaps you only want to act on some "Product" entity
        if ($entity instanceof Elections) {
            $person = $this->getDoctrine()
                       ->getRepository('FNQITServicesBMBundle:People')
                       ->find(2);

            $entity->setCreator($person);
        }
    }
}

Но событие не срабатывает во время вставки. т.е. файл /tmp/test не создается.

  • Я заметил, что есть kernel.event_listener, и я заметил, что это было kernel.listener несколько версий назад
  • Я попробовал различные комбинации атрибутов 'tags' в конфигурации.
  • Я отключил аннотации жизненного цикла, которые у меня были в организации Выборов (в случае возникновения конфликта)
  • Я посмотрел в журналах консоли события, чтобы попытаться найти упоминание о проблеме

Я использую CRUD Сонаты. Не уверен, если это что-то меняет.

Ответы [ 4 ]

0 голосов
/ 11 апреля 2012

Я создал services.xml в src / Acme / BMBundle / Resources / config следующим образом: -

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="acme_bm.listener" class="ACME\BMBundle\Listener\RecordManagement">
            <argument type="service" id="service_container" />
            <tag name="doctrine.event_listener" event="prePersist" method="prePersist"/>
        </service>
        <service id="acme_bm.listener2" class="ACME\BMBundle\Listener\RecordManagement">
            <argument type="service" id="service_container" />
            <tag name="doctrine.event_listener" event="preUpdate" method="preUpdate"/>
        </service>
    </services>
</container>

Затем я создал Listener / RecordManagement.php следующим образом: -

<?php
namespace ACME\BMBundle\Listener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Symfony\Component\DependencyInjection\ContainerInterface; 

class RecordManagement 
{
    protected $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container; 
    }


    public function prePersist(LifecycleEventArgs $args)
    {
.
.
.
    }
.
.
.
.
}
0 голосов
/ 26 марта 2012

возможно, это не проблема, но вы используете очень старую версию Symfony.возможно, сначала попробуйте обновить до последней стабильной версии (на данный момент 2.0.12)

0 голосов
/ 26 марта 2012

С той же проблемой.

Просто протестируйте это тем же способом с Symfony 2.0.12 (текущая версия) и сонатой, и это, похоже, не работает. Сейчас я использую событие onFlush для своих нужд.

Кажется, что SonataDoctrineORMAdmin не вычисляет право на Changeset, поскольку каждое поле всегда обновляется, поэтому вам придется проверять это вручную.

0 голосов
/ 14 марта 2012

Попробуйте

services:
recordmanagement:
    class: FNQITServices\BMBundle\Listener\RecordManagement
    tags:
        - { name: doctrine.event_listener, event: prePersist, method: testMethod }

и

<?php
    namespace FNQITServices\BMBundle\Listener;

    use Doctrine\ORM\Event\LifecycleEventArgs;
    use FNQITServices\BMBundle\Entity\Elections;
    use FNQITServices\BMBundle\Entity\People;

    class RecordManagement
    {
        public function testMethod(LifecycleEventArgs $args)
        {
            ...
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...