Есть ли простой способ создать пользовательскую функцию PHP XML Writer? - PullRequest
0 голосов
/ 11 апреля 2019

Я разрабатываю веб-API PHP (с использованием 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 голосов
/ 11 апреля 2019

Вот еще одна опция, которая позволяет добавлять больше структур данных без добавления всей логики в 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();
0 голосов
/ 11 апреля 2019

Вы можете наследовать от 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);

Вы можете добавить любую нужную вам функциональность. Это делает ваше творение меньше кода, но также добавляет возможность повторного использования.

...