14

新しい を作成するためのフォームがありCustomerます。顧客は携帯電話番号を持っている場合があります。携帯電話番号は、ユーザーが入力できるプレフィックス+なしで保持する必要があります。00これは、次の方法で簡単に実現できます。

$customer->setMobile(preg_replace("/^(\+|00)/", '', $customer->getMobile()));

このコードを配置するのに最適な場所はどれですか?

  • CustomerControllerエンティティマネージャーを呼び出す前に内部でエンティティを永続化します。これは本当に MVC パターンのコントローラーの問題ですか?
  • イベントの使用SanitizeCustomerSubscriberとリッスンFormEvents:POST_BIND
  • CustomerSanitizerサービスの利用

他のアイデアはありますか?もちろん、私は一般的なデータ操作について話しています。携帯電話番号は単なる例です。サニタイズするフィールドは複数ある可能性があります。

4

2 に答える 2

42

PRE_BIND処理される前に送信されたデータにアクセスできるイベントでこれを行う必要があります。

$builder->addEventListener(FormEvents::PRE_BIND, function (FormEvent $event) {
    $data = $event->getData();
    if (isset($data['mobile'])) {
        $data['mobile'] = preg_replace("/^(\+|00)/", '', $data['mobile']);
    }
    $event->setData($data);
});

ちなみに、Symfony 2.3以降、このイベントはと呼ばれてPRE_SUBMITいます。

于 2012-07-28T06:21:14.340 に答える
10

これをメソッドに入れますCustomer setMobile()— データ自体に近いほど良いです。このようにして、設定に使用するコントローラーやフォームに関係なく、携帯電話番号がサニタイズされます。

于 2012-07-28T07:59:34.840 に答える