Я делаю XMPP PHP-клиент , и в настоящее время, находясь на этапе тестирования, я сделал строфы (то есть присутствие), например:
const PRESENCE = <<<PRESENCE
<presence from="{from}" to="{to}" type="{type}" />
PRESENCE;
const PRIORITY = <<<PRIORITY
<presence from="{from}">
<priority>{priority}</priority>
</presence>
PRIORITY;
Однако при разработке библиотеки я хотелсделайте это несколько программно, так как мне кажется, что этот подход выглядит жестко закодированным, даже если я его анализирую, например, так:
$preparedString = str_replace(
['{from}', '{priority}'],
[$from, $priority],
Xml::PRIORITY
);
Итак, я в итоге создал класс Presence
, который должен содержать все методы, связанные с присутствием.и выступать в роли своего рода компоновщика XML, и это выглядит так:
private $instance = null;
public function __construct()
{
$this->instance = new \DOMDocument();
$this->instance->formatOutput = true;
}
public function requestPresence(string $from, string $to, string $type = "subscribe")
{
$presenceNode = $this->instance->createElement('presence');
$presenceNode->setAttribute("from", $from);
$presenceNode->setAttribute("to", $to);
$presenceNode->setAttribute("type", $type);
return $this->instance->saveXML($presenceNode);
}
public function setPriority(int $priority, string $from = null)
{
$presenceNode = $this->instance->createElement('presence');
if ($from)
$presenceNode->setAttribute("from", $from);
$priorityNode = $this->instance->createElement('priority');
$priorityNode->appendChild($this->instance->createTextNode($priority));
$presenceNode->appendChild($priorityNode);
return $this->instance->saveXML($presenceNode);
}
Но теперь у меня есть некоторые сомнения, поскольку я утроил свой код, и он был фактически более читаемым раньше.Я хотел бы сохранить его простым и эффективным, без дублирования кода, но я чувствую, что здесь что-то упущено.Есть ли более удобный способ сделать это?