[英]Best practices when generating XML web services data for PHP
我目前在我的项目中使用Fusioncharts Free,该项目要求XML必须采用特定格式,以用于数据显示和图表外观。
我有一个名为webservice.php的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>
更新此代码已成为维护方面的噩梦,但是,由于Fusioncharts需要特定的XML属性,因此无法使用标准格式(例如REST)传输数据。 有更好的方法来解决上述问题吗? 我可以轻松地提高代码的模块化和可维护性吗?
我有几个想法可以考虑。
#1
使用诸如Smarty之类的模板引擎可能会使其更易于维护。 至少它将摆脱PHP代码中的XML。
例如,您可以为发布的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
...不,我全力以赴:-)希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.