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

标签 events symfony listener

似乎是一个非常简单的问题,但我已经尝试了一段时间但无法让它工作。我需要 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();
    }
}

我从来没有得到echodie。我确信该事件正在被调度(解雇)。我使用调试(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/

相关文章:

php - @OneToOne 的使用语句 - Doctrine2

java - 如何改变SWT进度条的颜色?

java - 实现属性(property)变更通知的最佳方式是什么?

c# - 如何获取 WPF 中的内置路由事件列表

actionscript-3 - flash as3 - startDrag、stopDrag 的事件监听器?

symfony - 自动将所有者设置为实体 - API 平台

Symfony2 : Stateless Authentication set to true, session 仍在创建中

actionscript-3 - Flex 4.6 检查 creationComplete 是否已经发生

php - Symfony:服务容器 VS 静态方法

java - JavaSE 有 WebSocket 消息监听器吗?