如何在Symfony 2中为form.set_data事件设置监听器?

时间:2012-01-27 10:21:34

标签: events symfony listener

看起来像一个非常简单的问题,但我已经尝试了一段时间,但无法让它工作。我需要挂钩Symfony 2中的form.set_data事件,以便从现有的DB记录中修改表单中设置的数据。

我正在尝试以下方法:

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();
    }
}

我永远不会得到echodie。我确信该事件正在派遣(解雇)。我验证了使用调试(xDebug)。看起来监听器没有注册。

我做错了什么?有什么明显的东西我在这里不见了吗?

1 个答案:

答案 0 :(得分:3)

根据我的理解,您必须使用FormBuilder实例的调度程序来处理所有表单。*事件。

use Acme\DemoBundle\Form\EventListener\MyListener;

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

我使用addEventListener,因为cookbook entry仅提及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