【发布时间】: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