看起来像一个非常简单的问题,但我已经尝试了一段时间,但无法让它工作。我需要挂钩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();
}
}
我永远不会得到echo
或die
。我确信该事件正在派遣(解雇)。我验证了使用调试(xDebug)。看起来监听器没有注册。
我做错了什么?有什么明显的东西我在这里不见了吗?
答案 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。