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