Как контролировать XMPP XML - PullRequest
0 голосов
/ 04 января 2019

Я делаю 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);
}

Но теперь у меня есть некоторые сомнения, поскольку я утроил свой код, и он был фактически более читаемым раньше.Я хотел бы сохранить его простым и эффективным, без дублирования кода, но я чувствую, что здесь что-то упущено.Есть ли более удобный способ сделать это?

1 Ответ

0 голосов
/ 05 января 2019

DOMDocument - это более подробный интерфейс для XML, вы можете использовать SimpleXML, который сократит код базовой платы.

class XML {
    public static function requestPresence(string $from, string $to, string $type = "subscribe")
    {
        $instance = new SimpleXMLElement("<presence />");
        $instance["from"] = $from;
        $instance["to"] = $to;
        $instance["type"] = $type;

        return $instance->asXML();
    }

    public static function setPriority(int $priority, string $from = null)
    {
        $instance = new SimpleXMLElement("<presence />");
        if ($from)  {
            $instance["from"] = $from;
        }
        $instance->priority = $priority;

        return $instance->asXML();
    }
}

Это предполагает, что это два отдельных требования, и они являются просто служебными функциями, а не поддерживают какое-либо состояние.

Если вам нужно создать документ с большим количеством опций, тогда выполните следующие действия.может быть более полезным ...

class XML2 {
    private $instance = null;

    public function __construct()   {
        $this->instance = new SimpleXMLElement("<presence />");
    }

    public function requestPresence(string $from, string $to, string $type = "subscribe")
    {
        $this->instance["from"] = $from;
        $this->instance["to"] = $to;
        $this->instance["type"] = $type;

        return $this;
    }

    public function setPriority(int $priority, string $from = null)
    {
        if ($from)  {
            $this->instance["from"] = $from;
        }
        $this->instance->priority = $priority;

        return $this;
    }

    public function getXML()    {
        return $this->instance->asXML();
    }
}

, который вызывается с помощью ...

echo  (new XML2())->requestPresence("from", "to", "type")
    ->setPriority(1)
    ->getXML();

создает ...

<?xml version="1.0"?>
<presence from="from" to="to" type="type"><priority>1</priority></presence>

Использование решений DOMDocument или SimpleXML приведет кчувствую себя более раздутым, чем ваша оригинальная версия, но предоставит более надежное решение, более удобное в обслуживании, чем опора на обработку строк.

...