【问题标题】:Symfony validation only on new formSymfony 验证仅在新表单上
【发布时间】:2021-06-09 05:06:11
【问题描述】:

我的验证适用于创建新实体,并且不允许重复描述。

如何使此验证工作以更新实体,因为在更新实体时会调用验证器并显示错误。

我还在学习 Symfony,所以请让我知道我需要提供的更多详细信息。

descUnique.php


use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class descUnique extends Constraint
{
    public $message = 'The description "{{ value }}" is allready in use.';
}

descUniqueValidator.php

class descUniqueValidator extends ConstraintValidator {

    /**
     * @var Security
     */
    private $security;

    /**
     * @var Em
     */
    private $em;

    public function __construct(EntityManagerInterface $em, Security $security) {
        $this->em = $em;
        $this->security = $security;
    }

    public function validate($value, Constraint $constraint) {
        /* @var $constraint \App\Validator\descUnique */

        if (null === $value || '' === $value) {
            return;
        }

        $repo = $this->em->getRepository(Carrier::class)
                ->findUniqueName($this->security->getUser(), $value);

        
        if ($repo) {
            $this->context->buildViolation($constraint->message)
                    ->setParameter('{{ value }}', $value)
                    ->addViolation();
        }
    }

}

编辑

我在实体对象中的验证器声明。

    /**
     * @ORM\Column(type="string", length=100)
     * @Validator\CarrierDescUnique
     */
    private $description;

【问题讨论】:

  • 您的验证器中的$value 是运营商实体吗?如果是这样,根据此类的外观,您可以检查 id。所以,基本上if ($repo && $repo->getId() !== $value->getId()) 这假设getId() 即使你没有设置 id 也可以工作,例如它会返回 null 而不是整数。
  • 我已经更新了我的问题。有没有办法将实体传递给验证器?我的验证器只是传递表单中的值,而不是整个表单。

标签: php symfony validation


【解决方案1】:

显示的错误是什么?

如果没有错误消息,我唯一能看到的可能出错的是您没有在 validate 方法中检查 Constraint 的类型。会不会是偶然在这个验证器中测试了另一个约束?

另外,$value 的类型也未被检查。如果$value 既不是''null 也不是字符串(我假设字符串在您的情况下是正确的),这可能会导致一些问题。

【讨论】:

  • 没有错误,问题是它总是试图验证,我试图找到一种在更新期间不运行验证的方法。
  • 好吧,也许我理解错了这个问题。据我现在不明白-您只想在创建时进行验证?而不是验证已经创建的实体?在这种情况下,您需要对整个类而不是一个属性应用约束,并且在验证器内部有一些东西可以检查实体是否是新的(created_at 为 null / id 为 null 等取决于您的应用程序)。本文底部有一个如何对类应用约束的示例:symfony.com/doc/current/validation/custom_constraint.html
  • 是的,这是正确的。谢谢你,我发现symfonycasts.com/screencast/question-answer-day/… 更有帮助。
猜你喜欢
  • 2015-01-23
  • 1970-01-01
  • 2019-03-28
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多