php – Symfony / Validator:Callback中的属性验证

我正在尝试使用基于给定国家/地区验证的邮政编码创建一个地址实体.要走的路就是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())也不好,因为我必须手动复制违规可能具有的所有属性.

编辑:我已经尝试过,它确实是very ugly.

解决方法

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

/**
 * @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]);
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...