[英]Yii2 xml XmlResponseFormatter
我正在嘗試使用Yii2建立XML響應。 但是我的itemtag有一些問題
Itemtag為數組中代表數字鍵的元素命名。 例
$itemTag = 'test';
return $response = ['tests' => [0 => 'a', 1 => 'b']];
XML結果
<response>
<tests>
<test>a</test>
<test>b</test>
</tests>
</response>
但是,當我想在測試中創建一個新組時,它仍然獲得itemtag名稱。 例
return $response = ['tests' => [0 => 'a', 1 => 'b', 'days' => [0 => 'd1', 1 => 'd2']]];
這是xml結果
<response>
<tests>
<test>a</test>
<test>b</test>
<days>
<test>d1</test> // this should be day
<test>d2</test> // this should be day
</days>
</tests>
</response>
我該如何解決這個問題?
讓您自定義XmlResponseFormatter並覆蓋此函數:
protected function buildXml($element, $data)
{
if (is_array($data)
|| ($data instanceof \Traversable
&& $this->useTraversableAsArray
&& !$data instanceof Arrayable)
) {
foreach ($data as $name => $value) {
if(is_array($value) && $this->checkArrayKeyNumber($value)){
foreach ($value as $number => $childValue) {
$ele = new DOMElement($name);
$element->insertBefore(
$element->ownerDocument->createTextNode("\n")
);
$element->appendChild($ele);
$this->buildXml($ele, $childValue);
}
continue;
}
if (is_int($name) && is_object($value)) {
$this->buildXml($element, $value);
} elseif (is_array($value) || is_object($value)) {
$child = new DOMElement($this->getValidXmlElementName($name));
$element->insertBefore(
$element->ownerDocument->createTextNode("\n")
);
$element->appendChild($child);
$this->buildXml($child, $value);
} else {
$child = new DOMElement($this->getValidXmlElementName($name));
$element->insertBefore(
$element->ownerDocument->createTextNode("\n")
);
$element->appendChild($child);
$child->appendChild(
new DOMText($this->formatScalarValue($value))
);
}
}
} elseif (is_object($data)) {
if ($this->useObjectTags) {
$child = new DOMElement(StringHelper::basename(get_class($data)));
$element->appendChild($child);
} else {
$child = $element;
}
if ($data instanceof Arrayable) {
$this->buildXml($child, $data->toArray());
} else {
$array = [];
foreach ($data as $name => $value) {
$array[$name] = $value;
}
$this->buildXml($child, $array);
}
} else {
$element->appendChild(new DOMText($this->formatScalarValue($data)));
}
$element->insertBefore(
$element->ownerDocument->createTextNode("\n")
);
}
添加新功能以檢查數組數據的鍵在哪里為數字,例如
[
'days' =>
[
0 => 'd1',
1 => 'd2'
]
]
這個功能
private function checkArrayKeyNumber($array)
{
$keys = array_keys($array);
$numeric = true;
foreach ($keys as $key) {
if(!is_numeric($key)){
$numeric = false;
}
}
return $numeric;
}
最后,添加到您的自定義響應類init()
public function init()
{
parent::init();
$this->formatters['xml']
= 'path\to\your\custom\XmlResponseFormatter';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.