2012-01-27 10 views
2

かなり単純な問題のようですが、私はしばらくの間試してきましたが、動作させることはできません。既存のDBレコードからフォームに設定されているデータを変更するには、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(); 
    } 
} 

私はechoまたはdieを取得することはありません。私はそのイベントが派遣されている(解雇されている)と確信しています。デバッグ(xDebug)を使用していることを確認しました。リスナーが登録されていないようです。

私は間違っていますか?私がここで行方不明になっていることが明らかですか?

答えて

3

私が理解したところでは、すべてのフォーム。*イベントに対して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だけaddEventSubscriberに言及ので、私はaddEventListenerを使用。 Symfony APIを参照して、より多くの場合

services: 
    acme_demo.form.extension.myextension: 
     class: Acme\DemoBundle\Form\Extension\MyExtension 
     tags: 
      - { name: form.type_extension, alias: form } 

:サービスとしての拡張を

<?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')); 
    } 
} 

、レジスタ:あなたは、イベントがすべての形態のために追加する必要がある場合

、あなたは拡張機能を作成することができます。

関連する問題