MVC设计模式在Yii框架中的应用与研究
摘 要
文章对小型PHP框架Yii的MVC特性进行了研究。MVC是一种设计模式,它的目标是将应用程序的输入、处理和输出流程按照模型层、视图层和控制层的方式进行分离。Yii中的MVC使Web开发过程可复用度最大化,显著提高开发者的Web应用开发速度。
【关键词】Yii PHP框架 快速开发 MVC
1 引言
利用Web应用框架进行Web开发已成主流,目前大部分的Web应用框架都建立在MVC模式之上。使用框架开发不仅将视图层、数据层、控制层分离,实现人员分工的高效性,同时在提高代码复用的基础上,加快了开发速度。Yii 框架就是目前新兴的一种用PHP语言实现的MVC(模型—视图—控制器)模式的Web框架。 MVC模式将业务逻辑从用户界面的考虑中分离,这样开发者就可以更容易地改变每一部分而不会影响其它部分。随着网络应用的快速增加,MVC模式对于Web应用的开发无疑是一种非常先进的设计思想。
2 MVC设计模式
MVC是软件工程中的一种软件设计模式(Design pattern),是当前流行的Web应用框架的事实标准。它将业务逻辑、数据和界面显示进行分离来组织代码。MVC把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),这三个部分既相互分离,又相互联系,是一种低耦合、高内聚的设计模式,如图1所示。
MVC的优势为:
(1)实现了显示逻辑、控制逻辑和业务逻辑的分离。
(2)模型是整个系统最复杂、最核心的部分,模型的抽取有利于多个视图共用一个模型,避免了重复开发,提高了系统的可重用性。
(3)MVC有利于系统以后的扩展和移植。
3 Yii中的MVC应用
Yii 是一个基于组件的高性能 PHP 框架,用于快速开发各种 Web 应用。Yii的MVC模式提供了一种快速开发的手段,其核心理念是程序代码的重用和各种关注点的分离。
3.1 模型的应用
Yii的模型用于表示底层数据结构以及与其相关的业务逻辑,是Yii框架的核心。模型是CModel或其子类的实例,在Web应用的各部分共享,它是单独的数据对象,可以是数据表中的一行,或一个用户输入的表单。
3.1.1 对应数据表的模型(基于CActiveRecord类)
Active Record(AR)是一种对象关系映射(Object Relational Mapping)技术。模型将表映射到类,行映射到对象,列则映射到对象的数据。每一个AR类代表一个数据表(或视图),数据表(或视图)中一行各列字段的值对应AR对象中的一个属性,AR类的实例代表了数据表的一行。AR类不单单是数据表中的字段和类中属性的映射关系,它还需要在这些数据上处理一些业务逻辑,定义了所有对数据表的读写操作。
例如创建一个基于CActiveRecord 类的模型Product:
class Product extends CActiveRecord {
public static function model($className=__CLASS__) {
return parent::model($className);
}
public function tableName() {
return 'product';
}
public function rules() {
return array(array('title, content', 'required'),);
}
}
模型创建后,可以使用父类的方法完成数据表的插入、查询、更新、删除和事务等操作。
例如向数据表中插入新行:
$product=new Product;
$product->title='产品标题';
$product->content='产品描述';
$product->save();
3.1.2 对应表单的模型(基于CFormModel类)
通过HTML表单收集用户数据是Web程序开发的主要工作之一,基于CFormModel类的模型可以记录用户输入的数据,并进行验证。
下面的例子建立一个UserLogin模型类,用于在一个登录页面中收集用户的输入。由于登录信息只用于验证用户,并不需要保存,因此将UserLogin声明为表单模型。
class UserLogin extends CFormModel {
public $username;
public $password;
}
UserLogin中定义了两个属性:$username和$password,用于保存用户输入的用户名和密码。
用户提交表单后,模型被填充,为了确保用户的输入有效,需要将用户的输入和一系列规则进行验证,可以在rules()方法中指定这些验证规则,并返回一个规则配置数组。例如:
public function rules() {
return array(
array('username, password', 'required'), //要求username 和 password 为必填项
array('password', 'authenticate'), // 要求password 应被验证
);
}
3.2 视图的应用
视图负责与用户进行交互,提供Web应用的外观界面,是用户和应用系统的桥梁。Yii的视图按照用户期望的样式来显示模型中的数据,它主要包含控制显示格式的代码(如HTML)和简单的PHP代码(用于遍历、格式化并呈现数据)。
在Yii中,视图名称与其视图php脚本文件的名称是一致的,当渲染视图时,视图的名字被程序用于识别视图脚本文件。例如:视图update的名称对应一个名为update.php的脚本文件,要渲染时,通过传递视图的名称调用CController::render(),在protected/views/ControllerID目录下寻找对应的视图文件。
在视图脚本内部,通过$this来访问控制器实例,可以在视图里以$this->propertyName的方式获取控制器的任何属性,也可以用以下推送的方式传递数据到视图里:
$this->render( 'update', array ( 'model' => $model,'groupList'=>$groupList ) );
这种方式中,render()方法将提取数组的第二个参数到变量里,这样在视图脚本里,可以直接访问变量$model和$groupList。
为了最大程度重用视图代码,Yii提供了布局(Layout)、局部视图(Partial views)、小物件(Widgets)和助手类(Helper classes)等方法。
(1)布局包含Web应用界面中通用的视图区域(如页头和页脚),示例如下:
......页头部分......
<?php echo $content; ?>
......页脚部分......
其中的变量$content保存了Web内容视图的渲染结果。
(2)局部视图是用于重复使用的视图代码段。例如,在模型的创建和更新页面中使用局部视图_form.php来渲染此模型的输入格式。
(3)小物件是CWidget或其子类的实例,这是一个用于表现数据的组件。小物件内嵌于一个视图用来产生一些复杂而又独立的用户界面。例如,一个日历小物件可用于呈现一个复杂的日历界面。小物件使Web应用的界面更具有可复用性。使用一个小物件的方法:
<?php $this->beginWidget('path.to.WidgetClass'); ?>
......由小物件获取的页面内容......
<?php $this->endWidget(); ?>
如果没有页面内容,则用<?php $this->widget('path.to.WidgetClass'); ?>语句即可。
(4)助手类包含一些代码,用于实现格式化数据或生成HTML标签的小功能。 Yii提供了很多助手类,如CHTML类可以产生常用的HTML代码。
3.3 控制器的应用
控制器是把模型、视图和其它组件集成在一起,形成一个可运行的应用程序,来完成用户请求。当一个控制器运行时,它执行用户请求的动作,动作会引入相应的模型处理用户请求,然后模型用对应的业务逻辑组件来处理用户的请求并返回数据,最后控制器再调用相应的视图格式化模型返回的数据,进而呈现给用户。动作的最简形式是一个名字以action开头的控制器类方法。
控制器通常有一个默认的动作index,当用户的请求未指定要执行的动作时,将执行默认动作。默认动作可以通过设置CController::defaultAction来修改。
以下代码定义了一个product控制器,一个index动作(默认动作)和一个create动作。
class ProductController extends CController {
public function actionIndex() {
}
public function actionCreate() {
}
}
控制器和动作以 ID 识别。控制器 ID 是一种“path/to/abc”的格式,对应的控制器类文件为 “protected/controllers/path/to/AbcController.php”,其中的标志abc应替换为实际的名称(例如product对应 protected/controllers/ProductController.php)。动作ID是除去action前缀的动作方法名。例如,如果一个控制器类含有一个名为actionCreate的方法,则相应的动作ID为create。
用户以路由的形式请求特定的控制器和动作。路由是由控制器 ID 和动作 ID 连接起来的,两者以斜线分割。 例如,路由product/create代表ProductController及其create 动作。默认情况下,请求此控制器和动作的URL 为:http://hostname/index.php?r=product/create。
4 结束语
本文就Yii的MVC特性的应用进行了详细的描述,并举例说明了开发时的细节以及注意点。Yii作为一款开源PHP框架,以其优异的性能、丰富的功能和清晰的文档受到php开发者的关注。Yii从一开始就严谨设计以适合各种高流量的Web 应用开发。若能结合其它流行的Web框架的优缺点进行改进,相信Yii的使用者会越来越多。
参考文献
[1]Alexander Makarov.Yii Application Development Cookbook(Second Edition).Birmingham:Packt Publishing,2013.
[2]Yii官方网站, http://www.yiiframework.com/doc/guide/,2014.
[3]段斌,李光辉.基于MVC框架的公共部门绩效评价系统.计算机工程,2009,35(6):263-265.
[4]梁文新,宋强,刘凌霞. Ajax+PHP程序设计实战详解[M].北京:清华大学出版社,2010.
[5]李开涌.PHP MVC开发实战[M].北京:机械工业出版社,2013.
作者单位
安徽清新互联信息科技有限公司 安徽省合肥市 230088