PHP与MVC开发模式
MVC是一种源远流长的软件设计模式,早在20世纪70年代就已经出现了基于MVC的开发模式。
随着Web应用开发的广泛展开,也因为Web应用需求复杂度的提高,MVC这一设计模式也渐渐被Web
应用开发所采用。
随着Web应用的快速增加,MVC模式对于Web应用的开发无疑是一种非常先进的设计思想,无论
选择哪种语言,也无论应用多复杂,它都能为构造产品提供清晰的设计框架。MVC模式使得Web应用
更加强壮,更加有弹性,也更加个性化。本章先介绍什么是MVC,然后介绍几款PHP中常见的基于
MVC的开发框架及其应用。
20.1 什么是MVC模型
MVC模型是开发大型Web应用时可以采用的程序架构。MVC是Model_View_Control的缩写,简单
地讲,Model即程序的数据或数据模型,View是程序
视图界面,Control是程序的流程控制处理部分。
Model_View_Control是软件设计的典型结构。如
今这一设计思想也开始在Web开发中实践并流行起
来。在这种设计结构下,一个应用被分为三个部分:
model、view和controller,每个部分负责不同的功能。
model是指应用程序的数据,以及对这些数据的操作,
view是指用户界面,controller负责用户界面和程序
数据之间的同步,也就是完成两个方向的动作。这个
两个动作如下所示。
根据用户界面(view)的操作完成对程序数
据(model)的更新。
将程序数据(model)的改变及时反应到用户
界面(view)上。
PHP中的MVC架构可以用图20.1来描述。
使用MVC架构Web应用程序,可以使程序结构
更加清晰,增强代码稳定性。在MVC机制下,应用
被清晰地分为model、view、controller 3个部分,这3个部分依次对应了业务逻辑和数据、用户界面、
用户请求处理和数据同步。这种模块功能的划分有利于在代码修改过程中选取重点,而不是把具有不
同功能的代码混杂在一起造成混乱。随着开发规模的扩大,这种架构将有利于提高开发效率,有利于
控制开发进度。
图20.1 PHP的MVC架构
用
户
视
图
(V)
业
务
逻
辑
这里就是
控制器(C)
数据模型(M)
数据库
数据抽象层
MySQL/SQLite
20.2 MVC模型的组成
MVC是一个设计模式,它使Web应用程序的输入、处理和输出分开进行。MVC Web应用程序被
分成3个核心部件:数据模型(Model—M)、视图(View—V)、控制器(Controller—C)。一
个好的MVC设计,不仅可以使模型、视图、控制器高效完成各自的任务处理,而且可以让它们完美
地结合起来,完成整个Web应用。
20.2.1 控制器
控制器负责协调整个应用程序的运转,简单来讲,控制器的作用就是接受浏览器端的请求。它接
受用户的输入并调用模型和视图去完成用户的需求,当用户单击Web页面中的超链接或发送HTML表
单时,控制器本身不输出任何东西,它只是接收请求并决定调用哪个模型构件去处理浏览器端发出的
请求,然后确定用哪个视图来显示模型处理返回的数据。
20.2.2 数据模型
通常,Web应用的业务流程处理过程对其他层来说是不可见的,也就是说,模型接受视图请求的
数据,并返回最终的处理结果。
数据模型的设计可以说是MVC最主要的核心。对一个开发者来说,需要专注于Web应用的业务模
型的设计。MVC设计模式把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不
能隔得太远,也不能太近。MVC并没有提供模型的设计方法,只是用来组织管理这些模型,以便模
型的重构和提高重用性。从面向对象编程来讲,MVC定义了一个顶级类,在告诉它的子类有哪些是
可以做的。这一点对开发人员非常重要。
既然是数据模型,那么它就携带着数据,但数据模型又不仅仅是数据,它还负责执行那些操作这
些数据的业务规则。通常会将业务规则的实现放进模型,这样保证Web应用的其他部分不会产生非法
数据。这意味着,模型不仅仅是数据的容器,还是数据的监控者。
20.2.3 视图
从用户角度说,视图就是用户看到的HTML页面。从程序角度说,视图负责生成用户界面,通常
根据数据模型中的数据转化成HTML输出给用户。视图可以允许用户以多种方式输入数据,但数据本
身并不由视图来处理,视图只是用来显示数据。在实际应用中,可能会有多个视图访问同一个数据模
型。如“用户”这一数据模型中,就有一个视图显示用户信息列表,还有管理员使用的用于查看、删
除用户的视图。这两个视图同时访问“用户”这一数据模型。
在很多Web开发中,都会使用模板来生成用户最终看到的HTML页面。关于模板的有关知识,将
在下一节介绍。
20.3 PHP开发中的模板技术
在基于MVC模型的Web应用开发中,模板是不可或缺的。模板定义了一个并不完全的类HTML文
件,它为用户视图提供了最基本内容的框架,一些重要的数据需要在程序中添加到模板中,从而形成
完整的用户视图。本节将先介绍模板的基本概念和其在PHP程序中的用法,然后介绍一个优秀的模板
379
励志照亮人生 编程改变命运
第20章PHP与MVC开发模式
引擎—Smarty。
20.3.1 什么是模板
对于什么是模板这个问题,可以这样解释:模板是一组插入了HTML的PHP脚本或者说是插入了
PHP脚本的HTML,通过这种插入的内容来表示变化的数据。例如,下面的代码就是一个简单模板文
件的例子。
{greetings}
当用户浏览时,由PHP程序文件打开该模板文件,将模板文件中定义的变量进行替换,动态生成
内容,从而向用户显示一个完整的HTML页面。本例中的模板变量就是{greetings}和{pagetitle},这
两个变量是在PHP程序使用该模板时根据具体的内容来替换。下一小节将会看到处理该模板文件的具
体解决办法。
20.3.2 在PHP程序中使用模板
本节通过一个具体实例来演示如何在PHP程序中使用模板文件。首先,需要定义一个模板文件,
这里就使用20.3.1节中的示例代码,将其按文件名temp.html保存。接下来编写PHP文件,用来处理模
板,如代码20-1所示。
代码20-1 在PHP程序中使用模板(20-1.php)
$fs = fopen($template_file,”r”);
$content = fread($fs, filesize($template_file));
fclose($fs);
$content = print_page($content,”pagetitle”,”模板应用”);
$page = print_page($content,”greetings”,”你好,这个页面由模板生成”);
echo $page;
function print_page($temp_c,$temp_v,$str_c)
{
return ereg_replace(“{“.$temp_v.”}”,$str_c,$temp_c);
}
通过浏览器访问20-1.php,可以看到如图20.2所示的效果。
代码20-1在程序中打开一个模板文件,读出模板文件的内容。然后定义一个函数用来处理模板中
380
励志照亮人生 编程改变命运
零基础学 PHP
的模板变量,如代码第12行所示。函数print_page()非常简单,只有一行代码,这行代码通过正则表达
式替换函数将模板变量替换为程序中的实际数据。
虽然这个在PHP程序中使用模板变量的示例程序很小,但
却体现了模板在PHP程序中的处理思想。当然实际的模板引
擎要比这个复杂得多,也更能满足实际需要。本章的下一小
节将会介绍一个被PHP官方推荐使用的模板引擎,并通过一
些实例讲解模板引擎的使用。
20.3.3 Smarty模板引擎
对PHP来说,有很多模板引擎可供选择,如最早的PHPLIB template和后起之秀Fast template,经
过数次升级,已经相当成熟稳定。本小节要介绍的是一款易于使用且功能强大的PHP模板引擎—
Smarty。它分开了逻辑程序和外在的内容,提供了一种Web页面易于管理的方法。Smarty显著特点之
一是“模板编译”,这意味着Smarty读取模板文件然后用它们创建PHP脚本。这些脚本创建以后将被
执行,而不是去解析模板文件的语法。可以通过Smarty的官方 站获取Smarty模板引擎,官方 站的
址是http://www.smarty.net/。下面关于Smarty的介绍将以稳定的2.5版本为准。
下载Smarty安装包,解压后有3个目录:libs模板文件目录,其下有4个类文件1个目录。首先介绍
的是Smarty.class.php,它应该是整个Smarty模板的核心类。通常,需要在Web应用程序目录下建立如
下所示的目录结构。
appdir/smarty/libs,此目录对应压缩包下的libs目录,存放smarty需要的类文件。
appdir/smarty/templates_c,此目录存放模板文件,程序用到的模板文件都放在这里。
appdir/smarty/templates,存放模板属性文件。
appdir/smarty/configs,存放相关配置文件。
20.3.4 Smarty模板引擎的使用
下面通过一个实例程序介绍Smarty模板引擎在PHP程序中的使用。首先定义一个简单模板文件,
命名为20-2.tpl,并保存在当前目录下的templates子目录下。tpl是Smarty模板文件使用的后缀名,该
模板文件如代码20-2所示。
代码20-2 一个简单的Smarty模板文件(20-2.tpl)
{* 这里是Smarty模板的注释*}
大家好, 我是{$name}模板引擎, 欢迎大家在PHP程序中使用{$name}。
{* 模板文件结束*}
381
励志照亮人生 编程改变命运
第20章PHP与MVC开发模式
图20.2 在PHP程序中使用模板
先来解释一下这个模板文件。{*与*}之间的部分是模板页的注释,它在Smarty对模板进行解析时
不进行任何处理,仅起说明作用。{$name}是模板变量,它是Smarty中的核心组成,采用左边界符{与
右边界符}包含着、以PHP变量形式给出。
接下来完成显示模板的PHP程序,如代码20-3所示。
代码20-3 在PHP程序中使用Smarty模板引擎(20-3.php)
$smarty = new Smarty(); //建立smarty实例对象$smarty
$smarty->template_dir = “./templates”; //设置模板目录
$smarty->compile_dir = “./templates_c”; //设置编译目录
$smarty->left_delimiter = “{“; //设定左右边界符为{}, Smarty推荐使用的是
$smarty->right_delimiter = “}”;
$smarty->assign(“name”, “Smarty”); //进行模板变量替换
$smarty->assign(“page_title”, “Smarty的使用”); //进行模板变量替换
$smarty->display(“20-2.tpl”); //编译并显示位于./templates下的20-2.tpl模板
这段代码第2行将Smarty类心的类文件Smarty.class.php包含
到当前文件中。代码第4行生成Smarty类的实例$smarty,它代表
了一个Smarty模板。代码第5、6行分别设置模板文件所在目录及
模板文件编译后存放目录。代码第8、9行设定了模板变量的界定
符为“{”和“}”。第11、12行将模板变量替换为实际内容,最
后在代码第14行显示最终用户看到HTML视图。代码20-3的执行
结果如图20.3所示。
如果转到当前目录下的子目录template_c,可以看到其中有
一个由Smarty模板引擎生成的PHP文件,这个文件最终由Smarty
模板引擎调用,向浏览器端输出。打开这个文件,可以看到如下所示的代码。
把它保存在application/controllers/目录下,以本书为例,通过浏览器访问地址http://localhost/
ch20/index.php/hello,可以看到如图20.4所示的执行结果。
注意在CodeIgniter中,类名首字母必须大写。
例如,下面的代码写法就是不正确的。
{
//do something
}
386
励志照亮人生 编程改变命运
零基础学 PHP
代码20-4定义了一个Hello,它继承于Controller类,Controller类是CodeIgniter控制器基类,所有
的控制器都将从这个类派生。这个例子中用到的方法名是
index()。如果URI的第2部分为空,会默认载入index方法,
也就是说,也可以将地址写成http://localhost/ch20/index.php/
hello/index来访问hello.php。
由此可知,URI的第2部分决定调用控制器中哪个方法,
代码20-5演示了在Hello控制器中加入其他方法,此时的
hello.php如下所示。
代码20-5 为Controller添加方法(hello.php)
{
function index()
{
echo ‘Hello World!’;
}
function saylucky()
{
echo ‘It’s time to say “Good Luck”!’;
}
}
此时通过地址http://localhost/ch20/index.php/hello/
saylucky访问hello.php可以看到如图20.5所示的效果。
如果URI超过两个部分,那么超过的部分将被作为参数
传递给相关方法。如地址www.mysite.com/index.php/
products/shoes/sandals/123,URI中的sandals和123将被当
作参数传递给products类的方法shoes。代码20-6演示了这
种用法,仍然以hello.php为例,完整代码如下所示。
代码20-6 向Controller的方法传递参数(hello.php)
{
function index()
{
echo ‘Hello World!’;
}
function saylucky()
{
echo ‘It’s time to say “Good Luck”!’;
387
励志照亮人生 编程改变命运
第20章PHP与MVC开发模式
图20.4 Controller的使用
图20.5 为Hello控制器添加方法
}
function sayhello($name)
{
echo “Hello, $name !”;
}
}
Hello everyone!
2)将该代码保存到application/views/目录下。然后,需要使用某个方法载入该视图文件。这个方
法的用法如下所示。
$this->load->view(‘name’)
3)这行代码中,name是需要载入的视图文件的名字,文件的后缀名没有必要写出。接下来,在
hello控制器的文件hello.php中,写入这段用来载入视图的代码,此时完整的hello.php如代码20-8所示。
代码20-8 在Controller中载入视图(hello.php)
{
function index()
{
$this->load->view(‘helloview’);
}
function saylucky()
{
echo ‘It’s time to say “Good Luck”!’;
}
function sayhello($name)
{
echo “Hello, $name !”;
}
}
4)此时再通过地址http://localhost/ch20/index.php/hello浏览hello.php,将看到如图20.7所示的执
389
励志照亮人生 编程改变命运
第20章PHP与MVC开发模式
行结果。
5)通过这段代码,读者了解了如何载入一个视图。但视图中经常需要动态数据的内容,下面就
介绍如何处理含有动态数据的视图。动态数据通过控制器以一个数组或对象的形式传入视图,这个数
组或对象作为视图载入方法的第二个参数,如代码20-9所示。
代码20-9 向视图中添加动态数据(hello.php)
{
function index()
{
$data[‘title’] = “New Title – Hello.php”;
$data[‘heading’] = “大家好,欢迎使用CodeIgniter框架!”;
$this->load->view(‘helloview1’,$data);
}
function saylucky()
{
echo ‘It’s time to say “Good Luck”!’;
}
function sayhello($name)
{
echo “Hello, $name !”;
}
}
6)此时访问hello.php会看到如图20.8所示的执行结果,从图20.8可以看出浏览器上的页面标题和
页面的heading文字都更换成动态数据内容。
代码20-9的第6、7两行定义了数组$data的两个元素,这两个元素分别是页面的标题和页面的文本
内容。代码第8行向载入视图的方法view()传入第2个参数,该参数即代码前两行定义的数组。
7)最后还需要修改helloview.php,将在其中添加输出数据的PHP代码,修改后按helloview1.php
保存在application/views/目录下,修改后的代码如下所示,其中第3行和第6行有输出数据的PHP代码。
390
励志照亮人生 编程改变命运
零基础学 PHP
图20.7 在Controller中载入视图图20.8 向视图添加动态数据
至此, 已经介绍了C o d e I g n i t e r 的最简单的用法, 离实际应用开发还很远, 读者需要通过
CodeIgniter提供的手册进一步学习、理解CodeIgniter框架。
20.6 小结
本章介绍了PHP中的MVC模型。首先介绍了什么是MVC模型,以及MVC模型中控制器、视图和
数据模型的概念。然后介绍了PHP中的模板技术,包括什么是模板、如何在PHP程序中使用模板、
Smarty模板引擎的基本用法。接着,介绍了几款目前比较流行的PHP基于MVC的Web开发框架,包括
CodeIgniter、CakePHP、Zend Framework以及国产优秀框架FleaPHP。最后,以CodeIgniter为实例,
介绍了使用CodeIgniter开发PHP 络应用程序的基本思路和用法。
相关资源:凯利公司 KDZ 系列有刷串励、永磁、他励电机控制器设置软件.rar
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
至此, 已经介绍了C o d e I g n i t e r 的最简单的用法, 离实际应用开发还很远, 读者需要通过
CodeIgniter提供的手册进一步学习、理解CodeIgniter框架。
20.6 小结
本章介绍了PHP中的MVC模型。首先介绍了什么是MVC模型,以及MVC模型中控制器、视图和
数据模型的概念。然后介绍了PHP中的模板技术,包括什么是模板、如何在PHP程序中使用模板、
Smarty模板引擎的基本用法。接着,介绍了几款目前比较流行的PHP基于MVC的Web开发框架,包括
CodeIgniter、CakePHP、Zend Framework以及国产优秀框架FleaPHP。最后,以CodeIgniter为实例,
介绍了使用CodeIgniter开发PHP 络应用程序的基本思路和用法。
相关资源:凯利公司 KDZ 系列有刷串励、永磁、他励电机控制器设置软件.rar
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!