Symfony:在自定义约束中添加标准约束



我正在尝试添加一个定义在官方文档中定义的自定义约束,一个内置约束(例如,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,长度。

相关内容

  • 没有找到相关文章

最新更新