簡體   English   中英

Yii2 xml XmlResponseFormatter

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM