Symfony表单错误呈现

时间:2015-03-13 17:23:37

标签: php json symfony error-handling

我有以下问题。我使用Symfony Forms来验证JSON请求,这也很有用。但我也会以更加Json可读的方式抛出错误。

我是否可以从FormErrorIterator FormError获取相关字段名称的每个错误。

例如:

formName.SubForm.Propertyname => 'MyErrorMessage'

路径的结构也可以是数组。

1 个答案:

答案 0 :(得分:1)

如果要在数组中检索表单的错误,可以在控制器中添加和使用此方法:

private function getErrorMessages(\Symfony\Component\Form\Form $form) {
    $errors = array();

    foreach ($form->getErrors() as $key => $error) {
        if ($form->isRoot()) {
            $errors['#'][] = $error->getMessage();
        } else {
            $errors[] = $error->getMessage();
        }
    }

    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $errors[$child->getName()] = $this->getErrorMessages($child);
        }
    }

    return $errors;
}

$ errors将包含一系列错误,如果字段有错误,则字段名称将用作数组中的键:

$ errors [' FIELD_NAME'] = ERROR_MSG。

根据您的Symfony版本,您可能需要或想要此方法的其他版本:Symfony2 : How to get form validation errors after binding the request to the form

<强>更新

如果您的validation constraints位于Entity类的字段上,它们将位于errors数组中,并带有基于字段名称的键。

如果您的验证限制在Entity类上,则将使用#键或数字键,具体取决于表单是否为root。

实体类示例

/**
 * @Assert\Callback("isValidName") <- this error will be in $errors['#']
 */
class Author
{
    /**
     * @Assert\NotBlank() <- this error will be in $errors['firstname']
     */
    public $firstname;
}

如果您只希望在字段上出现错误,则需要在Entity字段上移动所有Entity类断言。