Symfony手动验证具有关系的实体

时间:2016-07-13 09:22:21

标签: php validation symfony entity relation

我想验证具有自定义约束的用户实体&验证器。到目前为止它在表单工作流程触发时工作,但是如果我手动触发它,我会在调用验证之前松开一个我设置的关系:

UserController:

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

$violations = $this->container->get('validator')->validate($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();

如何使用前面的设置关系手动验证此实体?

1 个答案:

答案 0 :(得分:0)

我的问题发现它起源于Symfony2表单验证结构。 :因为$ form-> handleRequest($ request)确实验证了表单,所有挂钩的验证器(组,自定义约束和回调)都被触发。

我的$ site为null因为验证器在我设置$ 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中。这样做,$ user完全传递给验证器。

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

这个系统的主要缺点是我必须在所有交互中手动触发这种类型的验证,但这种类型很复杂,在这里有意义。