有没有简单的方法来创建自定义PHP XML编写器函数?

时间:2019-04-11 07:41:15

标签: php xml laravel lumen

我正在开发一个PHP Web API(使用Laravel Lumen)来输出XML,但是编写XML结构和属性已经失控了,有没有简单的方法来创建可缩短代码库的自定义函数?

我正在使用PHP的$xml = new \XMLWriter();并编写如下代码:

$xml->startElement('DataStructure');
$xml->writeAttribute('version', "1.0");

我想做的事情是这样的:

$xml->startElement('DataStructure');
$this->api_version();

where

function api_version() {
    $xml->writeAttribute('version', "1.0");
}

2 个答案:

答案 0 :(得分:1)

您可以从XMLWriter继承来满足您的需求。您可以添加类似addDatastructure()的方法,然后像这样使用它:

class ExtendedWriter extends XMLWriter {
    public function addDatastructure($version): self {
        $this->startElement('DataStructure');
        $this->writeAttribute('version', $version);

        return $this;
    }
}

// And use it like a so:
$writer = new ExtendedWriter;
$writer->addDatastructure($version);

您可以添加所需的任何功能。这样可以减少创建代码的数量,但也增加了可重用性。

答案 1 :(得分:0)

这是另一个允许添加更多数据结构而无需将所有逻辑添加到XMLWriter的选项。

首先为您的数据结构类定义一个接口:

interface XMLWritable {
    public function writeTo(XMLWriter $writer); 
}

现在将方法添加到可以接受它的扩展XMLWriter中。另外,扩展XMLWriter的构造函数可以进行一些引导:

class MyXMLWriter extends XMLWriter {

    public function __construct(
      string $uri = 'php://output', string $version = '1.0', string $encoding = 'UTF-8'
    ) {
        $this->openURI($uri);
        $this->setIndent(true);
        $this->startDocument($version, $encoding);
    }

    public function write(XMLWritable $item): self {
        $item->writeTo($this);
        return $this;
    }
}

接下来,将接口实现为特定的数据类或序列化器。您可以根据需要添加类。 XMLWriter不需要了解它们。

class ExampleItem implements XMLWritable {

    private $_content;

    public function __construct(string $content) {
        $this->_content = $content;
    }

    public function writeTo(XMLWriter $writer) {
        $writer->writeElement('example', $this->_content);
    }
}

使用它们的方式如下:

$writer = new MyXMLWriter();
$writer->startElement('root');
$writer
  ->write(new ExampleItem('one'))
  ->write(new ExampleItem('two'));
$writer->endElement();