Использование JMSSerializer с аннотацией XmlKeyValuePairs
Я пытаюсь построить API с FOSRestBundle и JMSSerializerBundle на Symfony2. Мне удалось запустить его с выводом JSON отлично. Но вывод XML не очень хорош. Он запускает, генерирует данные XML, но данные бесполезны из-за имен тегов xml.
PHP-код для контроллера:
use JMS\Serializer\Annotation;
....
....
....
/**
* Version
* @return Response
*
* @Annotation\XmlKeyValuePairs
*
* @ApiDoc(
* resource=true,
* description="Method for API Version",
* statusCodes={
* 200="Success"
* },
* parameters={
* }
* )
*/
public function versionAction () {
$response = [
'code' => 200,
'message' => 'api version',
'data' => [
'version' => '0.0.1',
'lastupdate' => '2015-11-21 23:29:00',
'now' => (new \DateTime())->format('Y-m-d H:i:s')
]
];
return $response;
}
Вывод XML:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<entry>200</entry>
<entry><![CDATA[api version]]></entry>
<entry>
<entry><![CDATA[0.0.1]]></entry>
<entry><![CDATA[2015-11-21 23:29:00]]></entry>
<entry><![CDATA[2015-11-22 00:41:30]]></entry>
</entry>
</result>
Проблема здесь в том, что все теги XML являются "входными". То, что я хочу, это так:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<code>200</code>
<message>api version</message>
<data>
<version>0.0.1></version>
<lastupdate>2015-11-21 23:29:00</lastupdate>
<now>2015-11-22 00:41:30</now>
</data>
</result>
я использую @Annotation\XmlKeyValuePairs
как говорится в документации, но я не смог получить желаемый результат. Здесь есть исправление, и оно работает, но это не очень хорошее решение, потому что файл от композитора.
Я не знаю, что я что-то упустил, или это ошибка в JMSSerializerBundle, или в Symfony2, или мне нужно использовать другую аннотацию, чтобы заставить XmlKeyValuePairs работать?
1 ответ
Посмотрите на что-то вроде этого https://github.com/schmittjoh/JMSSerializerBundle/issues/59 Это было большой проблемой для меня, чтобы
<?php
namespace Ekv\System\Tmp\JmsSerializer;
use Doctrine\Common\Annotations\AnnotationRegistry;
use JMS\Serializer\Annotation\XmlKeyValuePairs;
use JMS\Serializer\Annotation\XmlList;
use JMS\Serializer\Annotation\XmlRoot;
/** @XmlRoot("api_result") */
class JmsXmlSerModel
{
/**
* @var array
* @XmlList(inline = true, entry = "item")
* @XmlKeyValuePairs
*/
private $array = array(
'key-one' => 'foo',
'key-two' => 1,
'nested-array' => array(
'bar' => 'foo',
),
'without-keys' => array(
1,
'test'
),
'mixed' => array(
'test',
'foo' => 'bar',
'1_foo' => 'bar'
),
1 => 'foo'
);
public function __construct($inArr)
{
$this->array = $inArr;
$this->init();
}
protected function init()
{
new XmlRoot();
new XmlList();
new XmlKeyValuePairs();
// https://stackru.com/q/14629137/1101589
// \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace(
// 'JMS\Serializer\Annotation',
// PATH_ROOT.'/vendor/jms/serializer/src'
// );
}
public static function usage($inputArray)
{
$serializer = \JMS\Serializer\SerializerBuilder::create()->build();
$xml = $serializer->serialize(new self($inputArray), 'xml');
//pa($res);
pa($xml);exit;
}
}