2012-05-11 9 views
3

私はDoctrine mongodbドキュメントをフォームに変換しました。ドキュメントには、2つのemebedOneドキュメントがあります。メイン文書は検証されていますが、埋め込み文書は検証されていません。私はカスタムアサーションを使用していますが、私はそれが重要であるとは思わない。Symfony2 Doctrine ODM埋め込みクラスフォームの検証

ドキュメントは

 
    class AccountRecord{ 
    /** 
    * @MongoDB\Id 
    */ 
    private $id; 

    /** 
    * @MongoDB\Field(type="BimcoreEmail") 
    * @Assert\Email 
    * @Assert\NotNull 
    * @CustomAssert\BimcoreEmail 
    */ 
    private $email; 

    /** 
    * Access Admin 
    * 
    * @MongoDB\Boolean 
    */ 
    private $access_admin = 0; 


    /** @MongoDB\EmbedOne(targetDocument="vidAccountSettings") */ 
    private $vid; 
    } 

は、カスタムは、この上で主張埋め込まクラスが呼び出されることはありません。

 
/** @MongoDB\EmbeddedDocument */ 
class vidAccountSettings { 
    /** 
    * Share section path 
    * 
    * 
    * @MongoDB\Field(type="Url") 
    * @CustomAssert\Url 
    */ 
    private $sharePath; 
} 

フォーム

 
class AccountEditFormType extends AbstractType 
{ 
    /** 
    * Builds the embedded form representing the user. 
    * 
    * @param FormBuilder $builder 
    * @param array  $options 
    */ 
    public function buildForm(FormBuilder $builder, array $options){ 
     $builder 
      ->add('prefix', 'hidden', array('required' => false)) 
      ->add('vid.access', 'checkbox', array('required' => false)) 
      ->add('vid.googleAnalytics', 'text', array('required' => false)) 
      ->add('vid.liveRail', 'text', array('required' => false)) 
      ->add('vid.sharePath', 'url', array('required' => false)) 
      ; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'intention' => 'editAccount', 
      'cascade_validation' => true, 
     ); 
    } 

    public function getName() 
    { 
     return 'bimfs_account_creation'; 
    } 



}

ハンドラの助けを

 
class AccountEditFormHandler 
{ 
    protected $request; 
    protected $userManager; 
    protected $form; 

    public function __construct(Form $form, Request $request, BimcoreAccountManager $accountManager) 
    { 
     $this->form = $form; 
     $this->request = $request; 
     $this->accountManager = $accountManager; 
    } 

    public function process($account) 
    { 
     // set the data in the form for the current account. 
     $this->form->setData($account); 

     if ('POST' === $this->request->getMethod()) { 

      $this->form->bindRequest($this->request); 
      if ($this->form->isValid()) { 
       $this->onSuccess($account); 
       return true; 
      } else { 
      } 
     } 

     return false; 
    } 


    protected function onSuccess(BimcoreAccountRecord $account) 
    { 
     // update the account data. 
     $this->accountManager->updateAccount($account); 
    } 
} 

感謝。

答えて

6

[OK]を

コーリーが、私はこれを考え出した、あなたが検証したい埋め込み用のレコードにアサート有効な文を設定する必要があります。

 
/** @MongoDB\EmbedOne(targetDocument="vidAccountSettings") 
    * @Assert\Valid 
    */ 
    private $vid;