php - ConstraintViolationListInterface 到 Symfony 中的异常

标签 php symfony symfony-validator

我需要转换类型为 ConstraintViolationListInterface 的对象用于进一步记录的单个异常,其中消息是来自列表上每个约束违规的消息的串联,当验证失败时。

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

最佳答案

我也很惊讶 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;
    }
}

所有代码可用 here .

我以另一种方式使用此异常:
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());
}

关于php - ConstraintViolationListInterface 到 Symfony 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47875979/

相关文章:

symfony - Sonata 管理包 + Sonata 用户包 : Override Login Form

Symfony2 : Auto htmlentities using Twig

symfony - 在 symfony2 中的另一个模板中加载一个带有 ajax 的 Twig 模板

symfony - 在实体之外使用 UniqueEntity 并且不使用表单

php - 快速手册 PHP API : Refresh OAuth 2 Token Failed

php - 如何在 PHP 中的不同 session 之间创建共享对象?

php - Laravel 解决闭包的依赖关系

php - 如果不是在 PHP 代码中,为什么 div 在结果 HTML 中获得一个额外的 "style=padding..."属性?