Symfony 根据条件验证对象
Symfony validate object on condition
我想仅在 $hasAddress
为真时验证我的 AddressDto
对象。有可能吗?
final class UserDto
{
/**
* @var bool
* @Assert\NotNull()
*/
public $hasAddress;
/**
* @var AddressDto
* @Assert\Valid()
*/
public $address;
}
final class AddressDto
{
/**
* @Assert\NotBlank()
*/
public $postalCode;
/**
* @Assert\NotBlank()
*/
public $city;
/**
* @Assert\NotBlank()
*/
public $street;
/**
* @Assert\NotBlank()
*/
public $houseNumber;
}
我尝试了回调验证,它有效,但我无法将错误附加到字段,只能附加到父表单。
final class UserDto
{
/**
* @var bool
* @Assert\NotNull()
*/
public $hasAddress;
/**
* @var AddressDto
*/
public $address;
/**
* @Assert\Callback()
*/
public function validate(ExecutionContextInterface $context, $payload): void
{
if ($this->hasAddress) {
$errors = $context->getValidator()->validate($this->address, new Assert\Valid());
foreach ($errors as $error) {
$context->buildViolation($error->getMessage())
->addViolation();
}
}
}
}
我已经检查了验证器文档,您只需将“atPath”添加到上下文中,这样您就可以指定要验证的字段。这是文档的 link:https://symfony.com/doc/current/validation/custom_constraint.html.
所以代码应该是:
public function validate(ExecutionContextInterface $context, $payload): void
{
if ($this->hasAddress) {
$errors = $context->getValidator()->validate($this->address, new Assert\Valid());
foreach ($errors as $error) {
$context->buildViolation($error->getMessage())
->atPath('address')
->addViolation();
}
}
}
我想仅在 $hasAddress
为真时验证我的 AddressDto
对象。有可能吗?
final class UserDto
{
/**
* @var bool
* @Assert\NotNull()
*/
public $hasAddress;
/**
* @var AddressDto
* @Assert\Valid()
*/
public $address;
}
final class AddressDto
{
/**
* @Assert\NotBlank()
*/
public $postalCode;
/**
* @Assert\NotBlank()
*/
public $city;
/**
* @Assert\NotBlank()
*/
public $street;
/**
* @Assert\NotBlank()
*/
public $houseNumber;
}
我尝试了回调验证,它有效,但我无法将错误附加到字段,只能附加到父表单。
final class UserDto
{
/**
* @var bool
* @Assert\NotNull()
*/
public $hasAddress;
/**
* @var AddressDto
*/
public $address;
/**
* @Assert\Callback()
*/
public function validate(ExecutionContextInterface $context, $payload): void
{
if ($this->hasAddress) {
$errors = $context->getValidator()->validate($this->address, new Assert\Valid());
foreach ($errors as $error) {
$context->buildViolation($error->getMessage())
->addViolation();
}
}
}
}
我已经检查了验证器文档,您只需将“atPath”添加到上下文中,这样您就可以指定要验证的字段。这是文档的 link:https://symfony.com/doc/current/validation/custom_constraint.html.
所以代码应该是:
public function validate(ExecutionContextInterface $context, $payload): void
{
if ($this->hasAddress) {
$errors = $context->getValidator()->validate($this->address, new Assert\Valid());
foreach ($errors as $error) {
$context->buildViolation($error->getMessage())
->atPath('address')
->addViolation();
}
}
}