Transform View
变换视图从你的model中提取数据,然后把数据转换成需要输出的格式。它实际上是使用一种语言逐个遍历你的数据元素,然后集中输出。
模版视图与变换视图之间的差异就是数据流的方向。在Template View中你先拥有一个输出的框架然后向里面插入domain数据。Transform View中则从数据着手,从它之中建立输出。
实施Transform View的主要技术是xslt.
Controller
controller是MVC里的一个角色,很多php MVC框架都讲到了。主要是出于这样的考虑:model对于应用是特定的,而几乎每个开发人员都已经有他们喜爱的模版引擎,它是视图的一个主要要素。那使得解释http回应,控制申请流(采取适当的行动来显示),两个关联的任务合为一个通用框架。
Front Controllers
它常常有助于集中控制应用流于一点。集中化可以帮助你了解一个复杂的系统是怎样运行的,以及提供你一个可以插入全局代码的空间,比如一个Intercepting Filter模式。对于集中化,Front Controllers对于集中控制的系统是很好的选择。
注:intercepting Filter
intercepting Filter模式是gof书中的Chain of Responsibility模式的一个实例。它考虑了运用普通任务的连续处理请求,譬如记log和安全。
这有两个普通的实例。一是在某个链中连续使用补空格直到到达application controller,另一个类似于一系列的油漆工,有助于前后的补空动作。(考虑移除空白或者一个压缩的filter,你可以在预处理输出缓存,在加工后执行你的filter)
作为一个简单的实例,一个Intercepting Filter和一个Front controller联合起来会是怎么样,假设我们有perfilter()以及postfilter()两种方法用于我们的filter接口。然后我们可以使用一种方法把filter加到我们的Front controller.
class FrontController { var $_filter_chain = array(); function registerFilter(&$filter) { $this->_filter_chain[] =& $filter; } } |
在运行实际的Front controller工作之前(产生页面,分派等等),我们可以在序列中使用prefilter()方法,在Front controller完成了它的任务后,postfilter()方法可以在相反的顺序调用。
class FrontController { Application controller |
Front controller通常代替了Application controller,而Application controller模式才是MVC controller的核心所在。controller的首要责任就是决定应用程序要做些什么来响应请求。
实现controller的最典型的方法就是使用命令模式。命令模式包含了对象中的一个动作,这样你就能用参数表示一个请求,写入请求队列,记入日志,或者支持操作(例如一个撤销动作)。在web应用的上下文关联中,分派给命令模式并完成一个特殊的http请求作为代码的目标是有用的。本质上,命令模式让你中止你的应用和代码的不连续行为,每个作为一个小的,便于管理的类,用一个相同的api使controller分派到一个明确的具体命令来实现需要的应用功能。
不要让强加的过多关于controller以及分派的叙述混淆你。如果你已经花了甚至几个小时在php上,那你可能已经写了一些Application controller. 比如,一个简单的传递回给它自己的表单,比如.....
if (count($_POST)) { // do form handling code } else { // display the form } |
....是一种Application controller形式。稍微有点复杂的Application controller像以下的:
switch ($_POST[‘action’]) { case ‘del’: $action_class = ‘DeleteBookmark’; break; case ‘upd’: $action_class = ‘UpdateBookmark’; break; case ‘add’: $action_class = ‘InsertBookmark’; break; case ‘show’: default: $action_class = ‘DisplayBookmark’; } if (!class_defined($action)) { require_once ‘actions/’.$action_class.’.php’; } $action =& new $action_class; $action->run(); |
$action_map = array( ‘del’ => ‘DeleteBookmark’ ,’upd’ => ‘UpdateBookmark’ ,’add’ => ‘InsertBookmark’ ); $action_class = (array_key_exists($_POST[‘action’], $action_map)) ? $action_map[$_POST[‘action’]] : ‘DisplayBookmark’; if (!class_defined($action)) { require_once ‘actions/’.$action_class.’.php’; } $action =& new $action_class; $action->run(); |
根据我在web应用方面的经验显示,一个双分派结构可以成为一个有用的mental map用来比较框架间依赖的分派装置。第一个调度是一个需要用你的model来进行的动作。在一个可见的动作之后,发出一个http跳转指令指示客户端去取得一个特定的View。第二个调度就是选择一个特定的View。(在这种方法的早期程序中,我使用了一个条件语句,但MVC实例本身对使用Command pattern进行调度)
延伸阅读:
理解PHP中的MVC编程之MVC框架简介
MVC模式的PHP实现
从魔兽看PHP设计模式
《PHP设计模式介绍》导言
PHP设计模式介绍 第一章 编程惯用法
PHP设计模式介绍 第二章 值对象模式
PHP设计模式介绍 第三章 工厂模式
PHP设计模式介绍 第四章 单件模式
PHP设计模式介绍 第五章 注册模式
PHP设计模式介绍 第六章 伪对象模式
PHP设计模式介绍 第七章 策略模式
PHP设计模式介绍 第八章 迭代器模式
PHP设计模式介绍 第九章 观测模式
PHP设计模式介绍 第十章 规范模式
PHP设计模式介绍 第十一章 代理模式
PHP设计模式介绍 第十二章 装饰器模式
PHP设计模式介绍 第十三章 适配器模式
PHP设计模式介绍 第十四章 动态记录模式
PHP设计模式介绍 第十五章 表数据网关模式
PHP设计模式介绍 第十六章 数据映射模式