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")