Symfony/Validator:回调中的属性验证

enu*_*mag 5 php validation symfony

我正在尝试使用基于给定国家/地区验证的邮政编码创建一个地址实体。要走的路显然是 CallbackValidator。现在我有这个代码:

use SLLH\IsoCodesValidator\Constraints\ZipCode;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

class Address
{
    /**
     * @Callback()
     */
    public function validatePostalCode(ExecutionContextInterface $context)
    {
        $constraint = new ZipCode([ 'country' => $this->country ]);
        $violations = $context->getValidator()->validate($this->postalCode, $constraint);

        foreach ($violations as $violation) {
            $context->getViolations()->add($violation);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是违规行为没有正确的路径。不过不知道怎么设置。还$context->buildViolation($violation->getMessage())并不好,因为我不得不手动复制所有的违规可能具有的特性。

编辑:我试过了,它确实很丑

enu*_*mag 2

这似乎有效。要点是,如果使用上下文验证器,您实际上可以指定验证路径。此外,您不需要重复违规,因为它们会直接添加到预期上下文中。

/**
 * @Callback()
 */
public function validatePostalCode(ExecutionContextInterface $context)
{
    $constraint = new ZipCode([ 'country' => $this->country ]);
    $validator = $context->getValidator()->inContext($context);
    $validator->atPath('postalCode')->validate($this->postalCode, $constraint, [Constraint::DEFAULT_GROUP]);
}
Run Code Online (Sandbox Code Playgroud)