Как получить ошибки формы в Symfony как JSON-объект с помощью JMSSerializer

Мне нужно иметь общее JSON-представление ошибок для любой формы, которая у меня есть.

Я уже читал другие решения, такие как как вернуть форму в кодировке json. ошибки в symfony. Но я не хочу создавать еще один сервис для задачи, которую уже может решить другой бандл, который я подключил к своему проекту.

Я использую JMSSerializerBundle в своем проекте, и я знаю, что этот пакет может обрабатывать ошибки формы Symfony, используя FormErrorHandler. Но теперь я могу получить только сериализацию всей формы:

$errors = $form->getErrors();
$serializer = $this->get('jms_serializer');
$json = $serializer->serialize($errors, 'json');

Этот код вернет мне следующий JSON-объект:

{
    "form": {
        "children": {
            "field1": [],
            "field2": [],
            "field_with_error": {
                "errors": ["Error text"]
            },
            "collection": {
                "child_form": [
                    {
                        "children": {
                            "field1": [],
                            "field2": []
                        }
                    }
                ]
            }
        }
    },
    "errors": []
}

Но мне нужно что-то вроде этого (только поля с ошибками):

{
    "field_with_error": {
        "errors": ["Error text"]
    }
}

Как я могу этого добиться? Я посмотрел на FOSRestBundle, который уже решил эту проблему. Но я не нашел, как они это сделали.


person Michael Sivolobov    schedule 26.01.2015    source источник
comment
Взгляните на это: JMSSerializer + формы/массивы. Возможно, вам придется написать собственный обработчик для выравнивания массива: Подписные обработчики   -  person slaur4    schedule 26.01.2015
comment
Я знаю, что я могу. Но я хочу использовать решение, которое уже есть в JMSSerializerBundle (FormErrorHandler). Как я могу это сделать?   -  person Michael Sivolobov    schedule 27.01.2015


Ответы (1)


Используя следующий код, вы можете получить ошибки той же структуры, что и вы:

$handler = new FormErrorHandler($this->get('translator'));
$visitor = new JsonSerializationVisitor(new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()));
$errors = json_encode($handler->serializeFormToJson($visitor, $editForm, array()));

Результат

"{"children":{"title":{"errors":["This value should not be blank."]},"summary":{"errors":["Give your post a summary!"]},"content":{"errors":["Your post should have some content!"]}}}"
person Turdaliev Nursultan    schedule 10.11.2015
comment
Это дает мне точно такой же результат (jms/serializer 1.1.0 и SF 3.1.0) - person Pierre de LESPINAY; 15.06.2016