《PHP设计模式介绍》第十七章 MVC 模式(2)_PHP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:《PHP设计模式介绍》第十五章 表数据网关模式
前一章中使用动态记录模式对数据库表进行建立,获取,更新(通过扩展实现删除)每一行的操作。动态记录模式是一种简单的抽象数据库连接的方式,但是这种简洁性也正是它的弱点。动态记录类只处理

使用savant的实例:

总有一些有复杂模版引擎甚至是"Plain Old PHP Pages"(popp)的模板无法可变换替换,而且嵌入了控制结构和其他逻辑到页面里。然而,给结果到你的应用程序的表述层的业务逻辑,维护就会变得相当困难。

注:写模版引擎

似乎写摸版引擎是php社区里的一种passage权利,搜索模版引擎逐字发现上百的结果。(这方面的实验例子可以看http://www.sitepoint.com/forums/showthread.php?t=123769)如果你不选择用普通的引擎,而是用你自己的,这儿有丰富的实例代码可以看。

地址http://wact.sf.net/index.php/TemplateView很好的概述了什么样式的标记可以被模版视图使用。包括一个属性语言,自定义标签,html备注以及自定义语法。

非常流行的模版引擎smarty(http://smarty.php.net/)是一个使用自定义语法方法的模版引擎的实例。

装载smarty引擎就像:

require_once ‘Smarty.class.php’;
$tpl =& new Smarty;
$tpl->assign(array(
‘title’ => ‘Colors of the Rainbow’
,’colors’ => array(‘red’, ‘orange’, ‘yellow’,
‘green’, ‘blue’, ‘indigo’, ‘violet’)
));
$tpl->display(‘rainbow.tpl’);


rainbow.html的自定义语法就像:

<html><head>
<title>{$title}</title>
</head><body>
<h1>{$title}</h1>
<ol>
{section name=rainbow loop=$colors}
<li>{$colors[rainbow]}</li>
{/section}
</ol>
</body></html>

wact(http://wact.sf.net/)效仿了martin fowler在poeaa中概述的那种自定义标签。虽然wact支持一个与smarty相似的自定义语法作为快捷方式,wact的自定义标签列阵如下:

require_once ‘wact/framework/common.inc.php’;
require_once WACT_ROOT.’template/template.inc.php’;
require_once WACT_ROOT.’datasource/dictionary.inc.php’;
require_once WACT_ROOT.’iterator/arraydataset.inc.php’;
// simulate tabular data
$rainbow = array();
foreach (array(‘red’, ‘orange’, ‘yellow’,
‘green’, ‘blue’, ‘indigo’, ‘violet’) as $color) {
$rainbow[] = array(‘color’ => $color);
}
$ds =& new DictionaryDataSource;
$ds->set(‘title’, ‘Colors of the Rainbow’);
$ds->set(‘colors’, new ArrayDataSet($rainbow));
$tpl =& new Template(‘/rainbow.html’);
$tpl->registerDataSource($ds);
$tpl->display();


rainbow.html的模版如下:

<html><head>
<title>{$title}</title>
</head><body>
<h1>{$title}</h1>
<list:list id=”rainbow” from=”colors”>
<ol>
<list:item><li>{$color}</li></list:item>
</ol>
</list:list>
</body></html>

在这个wact例子里有相当多的包含的文件。这是因为框架有各种各样的要素来处理网站应用问题的各个部分。只需包含你需要的元素。在上面的例子中,模板就是一个View,dictionary data source 作为model的代理,php脚本本身是作为一个controller.许多自定义标签设计成与表格数据一起运用--像你从数据库中提取的记录集---转换成简单数组以后把它用在模版里。

最后一个样式是拥有一个模版的有效的xml文件,使用各自的要素的属性作为目标替换你的模版。这里有一个是用PHP- TAL的技术实例(http://phptal.motion-twin.com/)

// PHP5
require_once ‘PHPTAL.php’;
class RainbowColor {
public $color;
public function __construct($color) {
$this->color = $color;
}
}
// make a collection of colors
$colors = array();
foreach (array(‘red’, ‘orange’, ‘yellow’,
‘green’, ‘blue’, ‘indigo’, ‘violet’) as $color) {
$colors[] = new RainbowColor($color);
}
$tpl = new PHPTAL(‘rainbow.tal.html’);
$tpl->title = ‘Colors of the Rainbow’;
$tpl->colors = $colors;
try {
echo $tpl->execute();
}
catch (Exception $e){
echo $e;
}

rainbow.tal.html的模版文件如下

<?xml version=”1.0”?>
<html>
<head>
<title tal:content=”title”>
place for the page title
</title>
</head>
<body>
<h1 tal:content=”title”>sample title</h1>
<ol>
<li tal:repeat=”item colors”>
<span tal:content=”item/color”>color</span>
</li>
</ol>
</body>
</html>

当然,所有的解决方法都是将model数据的显示从model以及应用程序本身分离出来。每个前期的实例都是实质上产生了同样的内容,所以选择哪个是个人喜好的问题。

分享:《PHP设计模式介绍》第十四章 动态记录模式
到目前为止,您所看到的这些设计模式大大提高了代码的可读性与可维护性。然而,在WEB应用设计与开发中一个基本的需求与挑战:数据库应用,这些设计模式都没有涉及到。本章与接下来的两章—

来源:模板无忧//所属分类:PHP教程/更新时间:2008-08-22
相关PHP教程