Symfony中ConstraintViolationListInterface异常

sup*_*r.t 1 php symfony symfony-validator

我需要将类型的对象转换ConstraintViolationListInterface为单个异常以进行进一步的记录,其中消息是验证失败时列表中每个约束违例的消息的串联。

显然,我无法使用验证在每个捆绑软件中重复一个foreach循环来实现这一点,因此我在考虑再创建一个捆绑软件,以提供一个接受ConstraintViolationListInterface并返回单个异常的简单服务。Symfony中对此有标准解决方案吗?似乎我需要编写此服务很奇怪,这个问题对我来说似乎很常见。

Vla*_*pak 6

我也惊讶于symfony对此无济于事,这就是为什么我创建了自定义异常的原因:

class ValidationException extends \Exception
{
    private $violations;

    public function __construct(array $violations)
    {
        $this->violations = $violations;
        parent::__construct('Validation failed.');
    }

    public function getMessages()
    {
        $messages = [];
        foreach ($this->violations as $paramName => $violationList) {
            foreach ($violationList as $violation) {
                $messages[$paramName][] = $violation->getMessage();
            }
        }
        return $messages;
    }

    public function getJoinedMessages()
    {
        $messages = [];
        foreach ($this->violations as $paramName => $violationList) {
            foreach ($violationList as $violation) {
                $messages[$paramName][] = $violation->getMessage();
            }
            $messages[$paramName] = implode(' ', $messages[$paramName]);
        }
        return $messages;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里提供所有代码。

我以另一种方式使用此异常:

try {
    $errors = $validator->validate(...);
    if (0 !== count($errors)) {
        throw new ValidationException($errors);
    }
} catch (ValidationException $e) {
    // Here you can obtain your validation errors. 
    var_dump($e->getMessages());
}
Run Code Online (Sandbox Code Playgroud)