获取所有错误以及错误所连接的字段

Jer*_*emy 4 php symfony symfony-2.1

我正在使用Symfony2表单来验证对API的POST和PUT请求.表单处理将请求数据绑定到底层实体,然后验证实体.除收集错误外,一切都很顺利.我正在使用FOSRestBundle并抛出一个Symfony\Component\HttpKernel\Exception\HttpException,其中包含400状态代码和一条包含表单错误消息的消息,如果验证失败.FOSRestBundle处理将其转换为JSON响应.我必须执行所有这些的控制器方法如下所示(所有字段将其错误冒充到表单):

protected function validateEntity(AbstractType $type, $entity, Request $request)
{
    $form = $this->createForm($type, $entity);
    $form->bind($request);
    if (! $form->isValid()) {
        $message = ['Invalid parameters passed.'];
        foreach ($form->getErrors() as $error) {
            $message[] = $error->getMessage();
        }
        throw new HttpException(Codes::HTTP_BAD_REQUEST, implode("\n", $message));
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我通过$ form-> getErrors()收集表单级错误时,我只能访问错误消息而不是错误连接到的字段的名称.当POST或PUT参数对应于相关实体的id时,这是一个特殊问题.如果提交的值无效,则该错误消息只是"此值无效",在此上下文中不是很好.理想情况下,我想做以下任何一种情况:

  • 对于每个错误,获取它所连接的字段名称,以便我可以格式化消息,如"fieldname:error message"
  • 如果不可能,是否可以为无效的实体类型自定义错误消息,以便显示比"此值无效"更好的内容?

Dan*_*ler 13

并且对于symfony> = 2.2

private function getErrorMessages(\Symfony\Component\Form\Form $form) {
    $errors = array();
    foreach ($form->getErrors() as $key => $error) {
        $template = $error->getMessageTemplate();
        $parameters = $error->getMessageParameters();

        foreach ($parameters as $var => $value) {
            $template = str_replace($var, $value, $template);
        }

        $errors[$key] = $template;
    }
    if ($form->count()) {
        foreach ($form as $child) {
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    }
    return $errors;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

使用此函数可在绑定表单后获取所有错误消息.

private function getErrorMessages(\Symfony\Component\Form\Form $form) {
    $errors = array();
    foreach ($form->getErrors() as $key => $error) {
        $template = $error->getMessageTemplate();
        $parameters = $error->getMessageParameters();

        foreach($parameters as $var => $value){
            $template = str_replace($var, $value, $template);
        }

        $errors[$key] = $template;
    }
    if ($form->hasChildren()) {
        foreach ($form->getChildren() as $child) {
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    }
    return $errors;
}
Run Code Online (Sandbox Code Playgroud)


Mun*_*Das 5

您可以将getErrorsAsString方法作为示例来获取所需的功能.您还必须invalid_message在表单字段上设置选项以更改This value is invalid消息.

  • 警告:不推荐使用getErrorsAsString,将在3.0中删除 (5认同)

Kar*_*ica 5

对于 Symfony 4.x+(可能适用于较低版本)。

// $form = $this->createForm(SomeType::class);
// $form->submit($data);
// if (!$form->isValid()) {
//     var_dump($this->getErrorsFromForm($form));
// }

private function getErrorsFromForm(FormInterface $form, bool $child = false): array
{
    $errors = [];

    foreach ($form->getErrors() as $error) {
        if ($child) {
            $errors[] = $error->getMessage();
        } else {
            $errors[$error->getOrigin()->getName()][] = $error->getMessage();
        }
    }

    foreach ($form->all() as $childForm) {
        if ($childForm instanceof FormInterface) {
            if ($childErrors = $this->getErrorsFromForm($childForm, true)) {
                $errors[$childForm->getName()] = $childErrors;
            }
        }
    }

    return $errors;
}
Run Code Online (Sandbox Code Playgroud)