#php #xml #laravel #lumen
#php #xml #laravel #lumen
Вопрос:
Я разрабатываю веб-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");
}
Ответ №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);
Вы можете добавить любую функциональность, которая вам нужна. Это делает ваше творение меньшим количеством кода, но также добавляет возможности повторного использования.
Ответ №2:
Вот еще один вариант, который позволяет добавлять больше структур данных без добавления всей логики в 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();