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

Validation 有效约束不支持symfony2中的组选项,validation,symfony-2.3,Validation,Symfony 2.3,我需要以symfony2形式级联验证,除非针对指定的组 这里symfony团队告诉我们,组选项在有效约束中不受支持 怎么做 详情: 我有一个用户实体具有address属性,它是address实体的外键。此外,我还有一个名为business的实体,它将用户作为属性,也将地址属性作为属性。我需要为用户验证地址,但当用户是企业财产时,不验证地址 模式 Class Address { ... } Class User { /** * @Assert\Valid(group

我需要以symfony2形式级联验证,除非针对指定的组

这里symfony团队告诉我们,组选项在有效约束中不受支持

怎么做

详情:

我有一个用户实体具有address属性,它是address实体的外键。此外,我还有一个名为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;
}
因此,我只需要验证用户表单中的地址,而不需要验证业务中的地址


谢谢

您可以在用户表单类型中添加验证规则。 别忘了删除注释


好的,我有一个解决办法。回调约束确实有“groups”选项,我们可以在这里使用它。在回调中,我们将调用所需实体的验证

我将使用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());
}
企业实体

// ...
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当然我的代码可以优化

我也面临同样的问题(Symfony 3)

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

并且不想将约束移动到表单中

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

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

/**
 * @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();
        }
    }
}

杰出贡献!这解决了Symfony 2.8中的类似情况。非常感谢。如何将组与此代码一起使用?你能在你的回答中解释一下吗?可能是