似乎是一个非常简单的问题,但我已经尝试了一段时间但无法让它工作。我需要 Hook Symfony 2 中的 form.set_data 事件,以便修改现有数据库记录中表单中设置的数据。
我正在尝试以下操作:
配置.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)验证了这一点。看起来监听器尚未注册。
我做错了什么?我在这里遗漏了一些明显的东西吗?
最佳答案
据我了解,您必须对所有 form.* 事件使用 FormBuilder
实例的调度程序。
use Acme\DemoBundle\Form\EventListener\MyListener;
function buildForm(FormBuilder $builder, array $options)
{
$listener = new MyListener();
$builder
->addEventListener('event', array($listener, 'method'), priority);
}
自cookbook entry以来我使用了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 .
关于events - 如何在 Symfony 2 中设置 form.set_data 事件的监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9031816/