【问题标题】:valid constraint does not support group options in symfony2有效约束不支持 symfony2 中的组选项
【发布时间】:2014-03-11 13:37:59
【问题描述】:

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

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

怎么做?

详情:

我有一个用户实体具有地址属性,它是地址实体的外键。此外,我有一个名为业务的实体,它有用户作为属性,还有地址属性。我需要验证用户的地址,但是当用户是业务的属性时,不验证它......

架构

Class Address {
    ...
}

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

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

所以我需要为用户表单验证用户内部的地址,而不是为企业验证。

谢谢

【问题讨论】:

标签: validation symfony-2.3


【解决方案1】:

我遇到了同样的问题(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 中的类似情况。非常感谢。
【解决方案2】:

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

我将使用 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 当然我的代码可以优化

【讨论】:

    【解决方案3】:

    您可以在您的用户表单类型中添加您的验证规则。 不要忘记删除您的注释。

    Follow this link to learn more about validation in form type

    【讨论】:

    • 如何通过此代码使用组?你能在你的回答中解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2013-10-14
    • 2012-04-13
    • 2016-03-22
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多