2012-01-27 94 views
2

看起來像一個非常簡單的問題,但我一直在嘗試一段時間,並不能得到它的工作。我需要鉤入Symfony 2中的form.set_data事件,以修改現有數據庫記錄中表單中設置的數據。如何在Symfony 2中爲form.set_data事件設置偵聽器?

我想以下幾點:

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)。看起來聽衆沒有被註冊。

我在做什麼錯?有什麼顯而易見的,我在這裏失蹤?

回答

3

根據我的理解,您必須使用您的FormBuilder實例的調度程序處理所有form。*事件。

use Acme\DemoBundle\Form\EventListener\MyListener; 

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

我使用,因爲cookbook entryaddEventListener只提到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