2012-02-08 14 views
2

私はフォームに表示する選択肢の動的リストを持っています。私は気にしなければならない唯一のデータセットではないので、それらを1か所に保持したいだけです。Symfony2&Annotations&Choices検証:選択肢の保存と検索の方法は?

Entity over-CallbackValidatorでこれらの選択肢を検証するには、選択肢が返されるフィックスクラスと関数を指定する必要があります。

これは私がまだSymfony2とDICの概念を学んでいて、具体的なコールバック関数/クラスを指定するのではなく、サービスを解決したり、これを解決する別の方法を考えているので正しくありません。

私はクラス名ではなく、コールバックとしてサービス名を与えたいと思います。私はここで間違っていますか?

私は今ここで、(それ以降)電子メールを送信するために知って注釈

  • セットアップをエンティティを検証するために、フォーム

  • を埋める

    • にオプションのリストが必要になります。

      services.yml - service_containerで定義され、Formがサービスとして定義されたDataManager(I don 'これが正しければt)を知っている:

      services: 
          data_manager: 
          class: TestBundle\Service\DataManager 
          arguments: 
            - "@service_container" 
            - %tc_data.list% 
          support_type_form: 
          class: TestBundle\Form\Type\TicketType 
          arguments: ["@service_container"] 
          tags: 
           - { name: form.type } 
      

      フォーム:

      class TicketType extends FormType 
      { 
          public function buildForm(FormBuilder $builder, array $options) 
          { 
           $theChoices = $this->getContainer()->get('data_manager')->getTheChoices(); 
           ... 
          } 
      } 
      

      エンティティ:

      class Ticket 
      { 
          /** 
          * @Assert\NotBlank() 
          * @Assert\Choice(callback = {"NotAServiceReference", "getTheChoices"}) 
          */ 
          private $the_list_field; 
      } 
      

      だから私は、サービス内のデータのリストを持っていますが、どのようにだろうエンティティを検証するための選択肢を取得することを提案しますか?

      // somehow you have an array of "fake names" 
      $fakeNames = array(); 
      

      /あなたがこれを解決するだろうましたか:私はコールバックの検証(リンク2)を使用して、それでもそこにはサイスドキュメントにあったと考え

      別の解決策は?

      参考文献:

      1. 参照:http://symfony.com/doc/current/reference/constraints/Choice.html#supplying-the-choices-with-a-callback-function(クリック注釈)
      2. を参照してください:あなたのサービスにservice_containerを渡すhttp://symfony.com/doc/current/reference/constraints/Callback.html#the-callback-method
  • 答えて

    1
    1. は避けてください。依存性注入の背後にある基本的な考え方は、実際に必要なオブジェクトだけを注入することです。
    2. DataManagerの場合、おそらくエンティティマネージャを注入したいだけです。
    3. TicketTypeについては、DataManagerサービスを挿入してください。どの時点で$ this-> dataManager-> getChoices()をすばらしい一般的な方法で行うことができます。

    エンティティ自体の中で検証する限り、本当に必要なものではありません。form-> isValid()は、あなたの選択が有効であることを確認するために既にチェックしています。しかし、Assert \ Choicesがサービスを指定できるはずであるという期待を理解することができます。ここから

    http://symfony.com/doc/current/reference/constraints/Callback.html

    それは制約としてサービスを指定するには、しかし、現在のところ不可能です。サービスを使用して検証するには、カスタム検証制約を作成し、その新しい制約をクラスに追加する必要があります。

    +0

    ありがとうございます。これは本当に助けになりました。あなたが提案したようにservice_containerを渡すのを避けました。各テストのたびにコンテナ全体を設定する必要がなければ、テストが簡単になることがポイントです。 DataManagerは、parameters.ymlからのデータのリストだけを注入します。あなたが言ったとおりにそれをしました、今清潔に見えます。私はこれを送って自分の考えを確認したときに私自身の検証と拘束を書くことができることを念頭に置いていました。ありがとう! – dazz

    関連する問題