3

我是 SF2 社区的新手,所以请放轻松;)

我遇到了 JMSSerializerBundle 和表单/数组的问题。我花了两天时间试图自己弄清楚,但没有任何成功,我决定将其发布到小组。

我正在构建一个简单的测试应用程序,它可以让我了解这些东西是如何工作的。现在是 API 的时候了。我正在使用 FOSRestBundle,效果很好。我的整个“应用程序”运行良好(开发非常快速和有效),我已经学会了如何使用安全组件、防火墙、路由、Doctrine(尽管我过去曾使用过它),编写自定义身份验证提供程序 - 我'我停留在 API,事实上,它的一部分。

表单问题:我在我的 APIBundle 中创建了简单的 ArticleController(请忽略文本响应,我刚刚在调试时删除了我的代码以使其更具可读性):

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

4

2 回答 2

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 配置,但文档更完整注释)

于 2013-03-17T11:16:45.793 回答
0

您只需要将注释更改为 xmllist:

@Serializer\XmlList(inline = true, entry = "article")
于 2016-12-20T11:51:03.013 回答