JMSSerializer + формы / массивы

Я довольно новичок в сообществе SF2, поэтому, пожалуйста, успокойтесь;)

Я столкнулся с проблемой с JMSSerializerBundle и формами / массивами. Я провел два дня, пытаясь выяснить это сам, без какого-либо успеха, и я решил опубликовать это в Группе.

Я создаю простое тестовое приложение, которое позволит мне понять, как все это работает. Теперь пришло время для API. Я использую FOSRestBundle, работает отлично. Все мое "приложение" работает отлично (разработка была действительно быстрой и эффективной), я научился использовать компонент Security, брандмауэры, маршрутизацию, Doctrine (хотя я работал с ним и раньше), написание пользовательских провайдеров аутентификации - я Я застрял на API, на самом деле, его часть.

Проблема с формами: я создал простой ArticleController в своем APIBundle (пожалуйста, игнорируйте текстовый ответ, я просто удалил свой код во время отладки, чтобы сделать его более читабельным):

namespace Veron\ApiBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\View\View;
use Veron\ApiBundle\Form\Type\ArticleType;
use Veron\CoreBundle\Entity\Article;
class ArticleController extends Controller
{
    public function createAction()
    {
        return $this->processForm(new Article());
    }
    private function processForm(Article $article)
    {
        $em = $this->getDoctrine()->getManager();
        $form = $this->createForm(new ArticleType(), $article, array(
            'csrf_protection' => false
        ));
        $form->bind($this->getRequest());
        if ($form->isValid()) {
            return new Response('Everything ok');
        }
        $view = View::create($form, 400);
        return $this->get('fos_rest.view_handler')->handle($view);
    }
}

Как видите, у меня также есть класс формы ArticleType:

namespace Veron\ApiBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ArticleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('description')
        ;
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'        => 'Veron\CoreBundle\Entity\Article',
            'csrf_protection'   => false,
        ));
    }
    public function getName()
    {
        return 'article';
    }
}

в чем проблема? При отправке запроса в XML или JSON - когда данные формы не проверяются - я получаю ошибки (хорошо отформатированные JMSSerializer):

Пример JSON:

{"errors":["This value should not be blank."],"children":{"title":{"errors":["This value is too short. It should have 5 character or more."]},"description":{"errors":["This value should not be blank."]}}}

Пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<form name="article">
  <errors>
    <entry><![CDATA[This value should not be blank.]]></entry>
  </errors>
  <form name="title">
    <errors>
      <entry><![CDATA[This value should not be blank.]]></entry>
    </errors>
  </form>
  <form name="description">
    <errors>
      <entry><![CDATA[This value should not be blank.]]></entry>
    </errors>
  </form>
</form>

Мой первый вопрос: есть ли какой-нибудь автоматизированный способ изменить вывод ошибок сериализованной формы?

У меня также есть проблема, связанная с первой, я полагаю. При возврате одного объекта я возвращаю следующую структуру XML:

<article>
    <id>10</id>
    <title>Test article</title>
</article>

возвращая массив (несколько статей), вывод:

<result>
    <entry>
        <id>1</id>
        ...
    </entry>
    <entry>
        <id>10</id>
        ...
    </entry>
</result>

Второй вопрос: как изменить структуру ответа XML/JSON?

2 ответа

Решение

Визуализация ошибок формы с помощью JMSSerializer обрабатывается этим классом: https://github.com/schmittjoh/serializer/blob/master/src/JMS/Serializer/Handler/FormErrorHandler.php. Возможно, вы могли бы написать свой собственный.

А что касается структуры, да, вы можете изменить ее, но что именно вы хотите сделать? Вы можете взглянуть на документацию, чтобы узнать больше об этом: http://jmsyst.com/libs/serializer/master/reference/annotations (Обратите внимание, что вы также можете использовать конфигурацию xml / yml, но документация более полна на аннотация)

Вам просто нужно изменить свои аннотации на xmllist:

@Serializer\XmlList(inline = true, entry = "article")
Другие вопросы по тегам