有效约束不支持symfony2中的组选项

时间:2014-02-12 22:32:43

标签: validation symfony-2.3

除非指定的组,否则我需要以symfony2形式级联验证。

这里symfony团队告诉有效约束不支持组选项 https://github.com/symfony/symfony/issues/4893

怎么做?

详细说明:

我有一个User Entity具有address属性,它是Address Entity的外键。此外,我有实体称为业务具有用户作为属性和地址属性。我需要验证用户的地址,但是,如果用户是Business的属性,则不进行验证...

模式

Class Address {
    ...
}

Class User {
     /**
     * @Assert\Valid(groups={"user"})
     */
     private $address;
}

Class Business {
    /**
     * @Assert\Valid(groups={"business"})
     */
     private $user;
    /**
     * @Assert\Valid(groups={"business"})
     */
     private $address;
}

所以我需要验证用户表单中的地址仅用于用户表单,而不是用于业务。

谢谢

3 个答案:

答案 0 :(得分:6)

我遇到了同样的问题(Symfony 3)。

我有一个实体UserInfo,其中两个字段链接到一个实体Place。 我需要在一个案例中验证两个字段,在另一个案例中验证一个字段。

并且不想将约束移动到Form中。

在第一个问题中,我使用了一个Callback约束来检查组并验证一个或两个字段。很好。但表单中的输入字段未标记为无效。所有错误都显示在表单的顶部。

然后我只是创建了自己的验证器。多亏了这一点,我可以为每个字段指定所需的组。并且相应地标记了表单中的所有无效输入字段。

/**
 * @Annotation
 * @Target({"PROPERTY", "METHOD", "ANNOTATION"})
 */
class ValidGroupAware extends Constraint
{
}

class ValidGroupAwareValidator extends ConstraintValidator
{

    /**
     * Checks if the passed value is valid.
     *
     * @param mixed $value The value that should be validated
     * @param Constraint $constraint The constraint for the validation
     */
    public function validate($value, Constraint $constraint)
    {
        if (!$constraint instanceof ValidGroupAware) {
            throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\ValidGroupAware');
        }

        $violations = $this->context->getValidator()->validate($value, [new Valid()], [$this->context->getGroup()]);
        /** @var ConstraintViolation[] $violations */
        foreach ($violations as $violation) {
            $this->context->buildViolation($violation->getMessage())
                ->setParameters($violation->getParameters())
                ->setCode($violation->getCode())
                ->setCause($violation->getCause())
                ->setPlural($violation->getPlural())
                ->setInvalidValue($violation->getInvalidValue())
                ->atPath($violation->getPropertyPath())
                ->addViolation();
        }
    }
}

答案 1 :(得分:4)

好的,我有一个解决方案。回调约束确实有'组'选项,我们可以在这里使用它。在回调中,我们将调用所需实体的验证。

我将使用PHP代码添加约束,但您可以使用注释。

用户实体

// ...
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
    $metadata->addConstraint(new Assert\Callback(array(
            'methods' => array('validAddress'),
            'groups' => array('user'),
        )));
}

public function validAddress(ExecutionContextInterface $context)
{
    $context->validate($this->address, 'address', $context->getGroup());
}

商业实体

// ...
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
    $metadata->addConstraint(new Assert\Callback(array(
            'methods' => array('validUser'),
            'groups' => array('business'),
        )));
    $metadata->addConstraint(new Assert\Callback(array(
            'methods' => array('validAddress'),
            'groups' => array('business'),
        )));
}

public function validUser(ExecutionContextInterface $context)
{
    $context->validate($this->user, 'user', $context->getGroup());
}

public function validAddress(ExecutionContextInterface $context)
{
    $context->validate($this->address, 'address', $context->getGroup());
}

PS当然我的代码可以优化

答案 2 :(得分:0)

您可以在User FormType中添加验证规则。 别忘了删除你的注释。

Follow this link to learn more about validation in form type