我正在尝试创建一个具有基于给定国家/地区验证的邮政编码的Address实体。最好的方法是使用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);
}
}
}
问题是违规行为没有正确的路径。不过我不知道该怎么设置。此外,$context->buildViolation($violation->getMessage())
也不好,因为我必须手动复制冲突可能具有的所有属性。
编辑:我试过了,确实很难看。
这似乎有效。关键是,如果使用上下文验证器,实际上可以指定验证路径。此外,您不需要复制违规行为,因为它们是直接添加到预期上下文中的。
/**
* @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]);
}