2012-03-13 35 views
0

簡単な作業:フォームを表示する前に、$data->getRole()"ROLE_"で始まる場合は、この文字列を削除して残りの部分のみを表示してください。ユーザーがフォームを送信するときは、逆の作業を行います。名前の前に"ROLE_"を追加します。変更されたデータを表示し、変更されたデータを更新するための正しいフォームイベント?

これを行うには最適な場所は何ですか?実際に私はPRE_SET_DATAPOST_BINDを使用しています。 これは、この操作を実行する正しいイベントですか?まあ接頭辞「ROLE」せずに役割を読ん

$builder->addEventListener(FormEvents::PRE_SET_DATA, 
     function(DataEvent $event){ 

     if(is_null($data = $event->getData()) || !$data->getId()) return; 

     $data->setRole(strtoupper(preg_replace('/^ROLE_/i', '', 
      $data->getRole()))); 

    }); 

    $builder->addEventListener(FormEvents::POST_BIND, 
     function(DataEvent $event) { 

     if(is_null($data = $event->getData()) || !$data->getId()) return; 

     $data->setRole('ROLE_' . strtoupper($data->getRole())); 

    }); 

答えて

1

私は、イベントを使用して行うだろうものではありません。彼らはあなたのワークフローに精通しているので、イベントは慎重に使用する必要があります! symfonyでしばらく作業していましたが、本当に他の方法がない場合は、私はそれらを1〜2回使いました。他のすべての時間は良い方法だった。

私は単に機能getShortRoleとsetShortRoleを追加し、エンティティ内shortRoleを使用する傾向があるでしょう:

class MyEntity { 
    private $role; 

    public function setShortRole($role) { 
     $this->role = 'ROLE_' . strtoupper($role); 
    } 

    public function getShortRole() { 
     return strtoupper(preg_replace('/^ROLE_/i', '', $this->role)); 
    } 
} 

あなたが自分でトラブルのモデルの代わりに、イベントでの作業の多くを保存しています!

第2のより複雑な方法は、エンティティの代わりにフォームを表し、フォームをエンティティにマップするモデルを使用することです。これについての良い記事はこちらhere! 私はそれを自分で使用し、それはうまく動作します。

関連する問題