Лучшие практики при генерации данных веб-сервисов XML для PHP - PullRequest
0 голосов
/ 05 декабря 2009

В настоящее время я использую Fusioncharts Free в своем проекте, который требует, чтобы XML был в определенном формате, как для отображения данных, так и для отображения диаграммы.

У меня есть файл PHP с именем webservice.php, в котором есть много похожих повторений:

$address = $_SERVER['PHP_SELF'];

...

if ($address == 'webService.php/fcf/last5pricechanges/'){
//query MySQL DB and build up XML string in $output variable to output to browser
//building up each line of XML more or less line by line
}

Выводимый XML может выглядеть так:

<graph caption="Active Items - Grouped by Site" showNames="1" decimalPrecision="0" bgcolor="eeeeee">
<set name="xyz.co.uk" value="1"/>
<set name="abc.com" value="5"/>
</graph>

Обновление этого кода становится чем-то вроде ночного кошмара, но на самом деле передача данных в стандартном формате, например REST, невозможна, поскольку Fusioncharts требует определенных свойств XML. Есть ли лучшие способы справиться с вышесказанным? Могу ли я легко улучшить модульность и удобство обслуживания моего кода?

1 Ответ

2 голосов
/ 05 декабря 2009

У меня есть пара идей, которые вы могли бы рассмотреть.

# 1
Использование движка шаблонов, такого как Smarty , вероятно, сделает его немного проще в обслуживании. Это по крайней мере избавит от XML из вашего PHP-кода.

Например, вы можете создать шаблон для размещенного вами фрагмента XML:

<?xml version="1.0" encoding="UTF-8" ?>
{foreach from=$graphs item=graph}
    <graph caption="{$graph.caption}" showNames="{$graph.show_names}" decimalPrecision="{$graph.decimal_precision}" bgcolor="{$graph.bg_color}">
    {foreach from=$graph.set item=set}
        <set name="{$set.name}" value="{$set.value}"/>
    {/foreach}
    </graph>
{/foreach}

И назовите его из PHP как

<?php
$address = $_SERVER['PHP_SELF'];

$smart = new Smarty();
$graphs = array();

if ($address == 'webService.php/fcf/last5pricechanges/')
{
    $graph_result = mysql_query("SELECT caption, show_names, decimal_precision, bg_color
                                 FROM graph WHERE something='something else'");
    while($graph_row = mysql_fetch_assoc($graph_result))
    {
        $graph_row;
        $set_result = mysql_query("SELECT name, value FROM set WHERE graph_id = {$graph_row['id']}");
        while($set_row = mysql_fetch_assoc($set_result))
        {
            $graph_row['sets'][] = $set_row;
        }
        $graphs[] = $graph_row;
    }
}

$smarty->assign('graphs', $graphs);
$smarty->display('graph_template.tpl');
?>

# 2
Вы можете создавать объекты, которые помогут вам управлять кодом. Например, чтобы сгенерировать тот же вывод XML, что и раньше, вы можете сделать:

<?php
class Graph
{
    protected $caption;
    protected $show_names;
    protected $decimal_precision;
    protected $bg_color;

    protected $sets;

    public function __construct($graph_id)
    {
        $graph_result = mysql_query("SELECT caption, show_names, decimal_precision_bg_color
                                 FROM graph WHERE something='something else'");
        while($graph_row = mysql_fetch_assoc($graph_result))
        {
            list($this->caption, $this->show_names, $this->decimal_precision, $this->bg_color) = $graph_result;
            $set_result = mysql_query("SELECT name, value FROM set WHERE graph_id = {$graph_row['id']}");
            while($set_row = mysql_fetch_assoc($set_result))
            {
                $this->sets[] = $set_row;
            }
        }
    }

    public function fetch_xml()
    {
        $output  = '<?' . 'xml version="1.0" encoding="UTF-8" ?' . '>';
        $output .= "<graph caption=\"{$this->caption}\" showNames=\"{$this->show_names}\" decimalPrecision=\"{$this->decimal_precision}\" bgcolor=\"{$this->bg_color}\">\n";
        foreach($this->sets as $set)
        {
            $output .= "<set name=\"{$set->name}\" value=\"{$set->value}\"/>\n";
        }
        $output .= "</graph>";
        return $output;
    }
}
?>

И назовите его в своем основном коде как:

<?php
$address = $_SERVER['PHP_SELF'];
if ($address == 'webService.php/fcf/last5pricechanges/')
{
    $graph = new Graph(1);
    echo $graph->fetch_xml();
}
?>

# 3
Вы можете попробовать использовать что-то вроде SimpleXML , но я сомневаюсь, что это очень поможет с ремонтопригодностью, поскольку это будет столь же многословно, как и метод echo

И # 4
... Нет, я все вне :-) Надеюсь, это поможет.

...