Как настроить прослушиватель для события form.set_data в Symfony 2? - PullRequest
2 голосов
/ 27 января 2012

Кажется, довольно простая проблема, но я пытался некоторое время и не могу заставить ее работать. Мне нужно подключиться к событию form.set_data в Symfony 2, чтобы изменить данные, устанавливаемые в форме, из существующей записи в БД.

Я пытаюсь сделать следующее:

config.yml:

services:
    Acme.DemoBundle.listener.set_data:
    class: Acme\DemoBundle\RequestListener
    tags:
        - { name: kernel.event_listener, event: form.set_data, method: onFormSetData }

RequestListener.php

namespace Acme\DemoBundle;
...
class RequestListener {
    public function onFormSetData(GetResponseEvent $event) {
        echo 'Eureka!'; die();
    }
}

Я никогда не получу echo или die. Я уверен, что событие отправлено (уволено). Я проверил это с помощью отладки (xDebug). Похоже, слушатель не регистрируется.

Что я делаю не так? Есть ли что-то очевидное, что я здесь скучаю?

1 Ответ

3 голосов
/ 08 февраля 2012

Насколько я понимаю, вы должны использовать диспетчер экземпляра FormBuilder для всех событий формы. *.

use Acme\DemoBundle\Form\EventListener\MyListener;

function buildForm(FormBuilder $builder, array $options)
{
  $listener = new MyListener();
  $builder
    ->addEventListener('event', array($listener, 'method'), priority);
}

Я использовал addEventListener, поскольку в записи поваренной книги упоминается только addEventSubscriber.

Если вам нужно добавить событие для всех форм, вы можете создать расширение:

<?php
namespace Acme\DemoBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormEvents;
use Acme\DemoBundle\Form\EventListener\MyListener;

class FormTypeMyExtension extends AbstractTypeExtension
{
  public function getExtendedType()
  {
    return 'form';
  }

  public function buildForm(FormBuilder $builder, array $options)
  {
    $listener = new MyListener();
    $builder->addEventListener('event', array($listener, 'method'));
  }
}

И зарегистрируйте добавочный номер как услугу:

services:
    acme_demo.form.extension.myextension:
        class: Acme\DemoBundle\Form\Extension\MyExtension
        tags:
            - { name: form.type_extension, alias: form }

Подробнее см. Symfony API .

...