JMSSerializer + forms/arrays

风流意气都作罢 提交于 2019-12-07 13:14:06

问题


I'm rather newcomer into SF2 community, so please, take it easy ;)

I've faced an issue with JMSSerializerBundle and forms/arrays. I've spent two days trying to figure it out myself, without any success and I've decided to post this to the Group.

I'm building a simple test application that will allow me to understand how the stuff works. Now it's time for API. I'm using FOSRestBundle, works perfectly. My whole "application" is working perfectly (development was really fast and effective), I've learned how to use Security component, firewalls, routing, Doctrine (however I worked with it in the past though), writing custom authentication providers - I'm stuck at API, in fact, a part of it.

Forms issue: I've created simple ArticleController in my APIBundle (please ignore text response, I've just removed my code in while debugging to make it more readable):

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);
    }
}

As you can see, I also have a ArticleType form class:

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';
    }
}

what the issue is? While sending a request, in XML or JSON - when the form data is not being validated - I'm getting the errors (well formated by JMSSerializer):

JSON example:

{"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 example:

<?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>

My first question is: is there any automated way to change the output of serialized form errors?

I also have an issue, related to the first one, I suppose. When returning single object, I have following XML structure returned:

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

while returning an array (multiple articles) the output is:

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

Second question: how to change response XML/JSON structure?


回答1:


The rendering of form errors with the JMSSerializer is handled bu this class : https://github.com/schmittjoh/serializer/blob/master/src/JMS/Serializer/Handler/FormErrorHandler.php . You could probably write you own.

And about the structure, yes you can change it, but what exactly do you want to do ? You can have a look at the documentation to learn more about it : http://jmsyst.com/libs/serializer/master/reference/annotations (Note that you can also use xml/yml configuration, but the doc is more complete on the annotation)




回答2:


You just need to change your Annotations to xmllist:

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


来源:https://stackoverflow.com/questions/15455823/jmsserializer-forms-arrays

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!