我正在尝试添加一个定义在官方文档中定义的自定义约束,一个内置约束(例如,Url)。
我在验证器类中添加了验证方法
use SymfonyComponentValidatorConstraintsUrl;
use SymfonyComponentValidatorConstraint;
public function validate($value, Constraint $constraint): void
{
[...]
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url());
}
在这篇文章中似乎是可能的。
不幸的是,它不起作用。违反不被添加到约束的另一个。我没有选择用不那么简洁的代码来代替代码,如:
use SymfonyComponentValidatorConstraintsUrl;
use SymfonyComponentValidatorConstraint;
public function validate($value, Constraint $constraint): void
{
[...]
$urlConstraint = new Url();
$violations = $this->context
->getValidator()
->validate($value, $urlConstraint);
if (count($violations) !== 0) {
$this->context
->buildViolation($urlConstraint->message)
->addViolation();
}
是否有可能将标准约束包含到自定义约束中(当然不需要直接将约束添加到Entity类中)?
在上面的示例中,我没有提到将验证放置在特定的验证组中。因此,没有触发标准约束。必须将标准约束附加到默认组:
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url(), Constraint::DEFAULT_GROUP);
Constraint::DEFAULT_GROUP
= 'Default'
我无法重现问题(Symfony 6.2),所有违规行为都被添加。也许问题出在别的地方。compare的代码:
namespace AppValidator;
use Attribute;
use SymfonyComponentValidatorConstraint;
#[Attribute]
class MyConstraint extends Constraint
{
}
namespace AppValidator;
use SymfonyComponentValidatorConstraint;
use SymfonyComponentValidatorConstraintsUrl;
use SymfonyComponentValidatorConstraintValidator;
class MyConstraintValidator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$this->context
->buildViolation('Not valid.')
->addViolation();
$this->context
->getValidator()
->inContext($this->context)
->validate($value, new Url());
}
}
namespace AppRequest;
use AppValidatorMyConstraint;
use SymfonyComponentValidatorConstraintsEmail;
use SymfonyComponentValidatorConstraintsLength;
class YourRequest
{
#[Email]
#[MyConstraint]
#[Length(exactly: 2)]
public string $value;
}
在这种情况下,显示4个违规:Email, 'Not valid. '', Url,长度。