Symfony 验证仅在新表单上

Posted

技术标签:

【中文标题】Symfony 验证仅在新表单上【英文标题】:Symfony validation only on new form 【发布时间】: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 而不是整数。 我已经更新了我的问题。有没有办法将实体传递给验证器?我的验证器只是传递表单中的值,而不是整个表单。 【参考方案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/… 更有帮助。

以上是关于Symfony 验证仅在新表单上的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2.3 使用 handleRequest 验证表单非常慢

Symfony 3.4 和模态表单验证

symfony2 表单验证单选按钮

重新验证表单 Symfony 3 [关闭]

Symfony2 - 验证不适用于嵌入式表单类型

Symfony,在表单中预先提示/显示验证约束消息