2013-03-16 6 views
3

Я довольно новичок в SF2 сообщество, поэтому, пожалуйста, успокойся;)JMSSerializer + формы/массивы

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

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

Формы выпуска: я создал простой 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> 

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

ответ

1

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

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

+0

Благодарим за отзыв. Что я хотел бы достичь? В случае ошибок формы я хотел бы иметь простую структуру: ' Значение не должно быть пустым'. То же самое касается сериализованных массивов, я хотел бы иметь '' как элемент корня XML и '

' в качестве своих дочерних элементов. У вас такие проблемы решены в стиле Symfony 2? – user1854344

0

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

@Serializer\XmlList(inline = true, entry = "article") 

 Смежные вопросы

  • Нет связанных вопросов^_^