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 验证仅在新表单上的主要内容,如果未能解决你的问题,请参考以下文章