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();
        }
    }
}