2016-07-13 10 views
0

私は、カスタムエンティティ&バリデータでユーザエンティティを検証したいと考えています。これまでのところ、フォームワークフローによってトリガされたときに働いているが、私はそれを手動でトリガした場合、私は検証呼び出す前に、1つのリレーションIのセットアップを失う:symfonyが手動でリレーションを持つエンティティを検証する

UserControllerで:サイトの関係に

$user = new User(); 
$user->setRoles($roles); 
$user->setSite($site); 
... 

$violations = $this->container->get('validator')->validate($user); 

Userエンティティ:

/** 
    * @var Site the site linked to the entity 
    * @ORM\ManyToOne(targetEntity="LCH\MultisiteBundle\Entity\Site", cascade={"all"}) 
    * @ORM\JoinColumn(name="site_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $site; 

バリ:

public function validate($user, Constraint $constraint) 
    { 
     $email = $user->getEmail(); 

     // $site var is null while other "direct fields are filled 
     $site = $user->getSite(); 
     $roles = $user->getRoles(); 
     $username = $user->getUsername(); 

どのように私は手動でvalidatすることができますeこのエンティティは、先に設定された関係を使用しますか?

+0

リポジトリから$サイトを取得するにはどうすればよいですか? – Edu

+0

はい、find($ id)ビルトインメソッドで、$ idはフォームの型によって提供されます。 EntityManagerスコープの問題について考えていますか? – nbonniot

+0

検証する前にユーザーを永続化させることができます – Edu

答えて

0

私の問題は、Symfony2フォームの検証構造の由来を発見しました。 :$ form-> handleRequest($ request)は実際にフォームを検証し、すべてのフックされたバリデータ(グループ、カスタム制約、コールバック)がトリガされます。バリデータは、私がする$ user->サイト属性を設定する前に...ここ

// sumbit in this method trigger validation too early in my needs 
$form->handleRequest($request); 
$em = $this->getDoctrine()->getManager(); 
if ($form->isSubmitted() && $form->isValid() && !$isAjax) { 
    // custom processes to decide what to create 
    ... 
    // Here is the user creation 
    $user->setRoles($roles); 
    $user->setSite($site); 
    ... 
    // And the check 
    $violations = $this->container->get('validator')->validate($user); 
} 

ソリューションは、メインタイプでdisabling validation groupsに嘘をついた長い解雇されたため

マイ$サイトはNULLでした。そうすることで、$ userはバリデーターに完全に渡されます。

public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'validation_groups' => false, 
     )); 
    } 

このシステムの主な欠点は、私は手動ですべての相互作用で、この非常に種類の検証をトリガしなければならないということですが、このタイプは、ここでは意味を作るのに十分複雑です。

関連する問題