1、php.MVC 系列教程之控制器 php.MVC 系统教程之配置文件 php.MVC 系列教程之对象关系 php.MVC 系列教程之目录文件 php.MVC 系列教程之处理流程 php.MVC 系列教程之框架介绍 php.MVC 系列教程之安装配置 php.MVC 系列教程之前言 一,前言:ASP,JSP,PHP 是 WEB 开发的三大技术,三种技术优缺点也早就有人分析过了。无非也就是 ASP 简单易用且有 microsoft 做靠山,JSP 功能强大是因为有 java 支持,PHP 则开源跨平台。在国内,ASP 应用范围最广,JSP 发展势头最猛,PHP 则处于劣势。这可能与公司的支持以及技
2、术的培训有关。由于公司项目的需要,我这才接触 PHP,用过一段时间后两点体会最深刻,一是学习容易,上手极快,内置函数很多,适合快速开发;二是学习资料匮乏,普及不广,很多时候都要去看英文文档。对于中小型 WEB 应用来说,PHP 有很强的竞争力,LINUX+APACHE+MYSQL+PHP(LAMP)的组合几乎可以胜任绝大多数网站的解决方案,对于大型应用来讲,对于系统架构要求更高,需要有成熟的框架支持,JSP 的 struts 是个不错的框架,国内介绍它的资料也非常多,应用逐渐广泛起来,对应的 PHP 也有php.MVC,但是我搜遍了网络也没有发现一篇中文文档,这才让我动了翻译用户指南念头,也算
3、是抛砖引玉,希望 PHP 能够在国内蓬勃发展起来。 php.MVC 是 PHP Web 应用程序的一个开源框架,它实现了模型视图控制器(MVC)设计模式Web 应用程序的工业标准,鼓励基于 Model2 架构的应用程序设计。这种开发模式允许网页或其他显示内容从内部应用程序代码中分离出来,让设计者和程序员更容易地集中于他们各自的专业领域。这个框架提供了一个单独入口点的控制器。这个控制器接受 HTTP 请求,并根据配置文件分配给相应的动作处理。模型包含了应用程序的业务逻辑,控制器负责处理请求,并转向到相应的显示组件将 HTML 和 PHP 标签的结合起来的模板文件。处理结果返回给客户端浏览器,或者
4、通过另外的协议比如 SMTP。php.MVC 是用 PHP 来实现 Jakarta Struts 框架,目前它支持 Struts 的许多特性,包括申明应用程序的配置参数通过 XML 解析器。比如在 XML 配置文件中指定各种业务逻辑组件与对应的显示组件之间的映射。php.MVC 的网站地址 http:/二,php.MVC 系列教程之安装配置php.MVC 必须安装在 PHP v 4.1.0 及以上版本的 Web 服务器上Windows(Apache 2.0.51+php-4.3.9-Win32)1.从 http:/www.apache.org 下载相应的 Apache 版本。2.从 http:
5、/ 下载相应的 PHP 版本。3.从 http:/ 下载相应的 php.MVC 版本。4.建立目录 c:www 作为 Web 服务器目录,c:webapp 作为 Web 根目录,你也可以定义自己的目录,以下作相应的修改即可。5.将 Apache 安装到 c:www,打开浏览器,在地址栏输入 http:/localhost 测试是否安装成功注意:如果你的系统上已经安装有其他 Web 服务器(如 IIS 5),且占用了 80 端口,请先停止该服务器。6.把 PHP 压缩包解压到 c:www。7.将 c:wwwphp-4.3.9-Win32 目录下 php.ini-dist 拷贝到系统目录如 c:w
6、innt 中并更名为php.ini,将 php4ts.dll 拷贝到系统目录如 c:winntsystem32 中,打开 c:wwwApache GroupApache2conf 目录下 http.conf 文件,在 ScriptAlias /cgi-bin/ “c:/www/Apache Group/Apache2/cgi-bin/“下加入ScriptAlias /php/ “c:/www/php-4.3.9-Win32/“AddType application/x-httpd-php .phpAction application/x-httpd-php “/php/php.exe“并将 D
7、ocumentRoot “c:wwwApache GroupApache2htdocs“改为 DocumentRoot “c:/webapp“8.把 php.MVC 压缩包解压到 c:webapp9.打开 c:webappphpmvc 目录下 Main.php 文件,修改如下内容/ Set php.MVC library root directory$appServerRootDir = c:webappphpmvc; / no trailing slash/ Set the application path$moduleRootDir = c:webappphpmvc; / no trail
8、ing slash/ Set the OS Type Optional UNIX|WINDOWS|MAC if we have/ trouble detecting the server OS type. Eg: path errors.$osType = WINDOWS;确认 c:webappphpmvcWEB-INF 目录下 phpmvc-config.data 有可写权限。打开浏览器,在地址栏输入 http:/localhost/phpmvc/Main.php?do=stdLogon 测试是否安装成功。10.要查阅更为详细的安装文档,请看http:/ 系列教程之框架介绍:一、介绍php.
9、MVC 是一个开放源代码的 Web 应用框架,实现了模型- 视图-控制器(MVC) 设计模式,鼓励基于 Model2 架构的应用程序设计。这种开发模式允许网页或其他显示内容从内部应用程序代码中分离出来,让网页设计者和程序员更容易地集中于他们各自的专业领域。这个框架提供了一个单独入口点的控制器。这个控制器接受 HTTP 请求,并根据配置文件分配给相应的动作处理。模型则包含了应用程序的业务逻辑。当请求处理完成,控制器调用相应的显示组件通常用模板文件来实现。处理结果返回给客户端浏览器,或者通过另外的协议比如 SMTP。php.MVC 是用 PHP 来实现 Jakarta Struts 框架,目前它支
10、持 Struts 的许多特性,包括通过 XML 解析器实现 XML 与对象的映射,从而设置应用程序的配置参数。比如在 XML配置文件中指定各种业务逻辑组件与对应的显示组件之间的映射。图 1图 1 所示的逻辑图描述了框架的高层结构。可以看出框架包括三个主要的组件:前端控制器、主控制器和动作分配器。二、优/缺点优点:1. php.MVC 是一个开源项目能让你完全接触源代码,使开发者能更深入的了解其内部实现机制。2. 使用 php.MVC 可以促进模块化开发,促使开发者和设计者的角色分离,提高代码的重用性和可维护性。3. php.MVC 框架的学习可以借鉴 Jakarta Struts 的一些知识和
11、经验,如果你有开发 Struts的经验,那么就可以快速地用 php.MVC 来进行开发。4. MVC 模式是 Java 开发 Web 应用程序的一个设计标准,使用 php.MVC 框架还有助于Web 开发者理解 MVC 设计模式。缺点:1. php.MVC 功能仍在不段变化和完善中,你需要随时关注最新版本。2. 使用 php.MVC 需要进行额外的学习过程。3. 应用 php.MVC 可以得到清晰的程序结构,但也会增加系统复杂度。4. 应用 php.MVC 可以让程序更加有条理,但也会降低程序执行速度。因此你需要根据项目大小、周期、成本,开发人员素质等众多条件来决定是否应用php.MVC 框架
12、。四、php.MVC 系列教程之处理流程:php.MVC 框架由许多类组装而成,但是我们不必了解所有类的详细工作过程也可以使用这个框架,图 2 显示了我们使用该框架需要了解的一些核心组件。图 2从图 2 我们可以看到一个典型的 Web 浏览器的 HTTP 请求如何与我们应用程序框架的核心类进行交互,然后如何得到 HTTP 响应返回到 Web 浏览器。现在,让我们以一个实例来了解框架的处理流程。比如要查看公司销售报表,先在浏览器地址栏输入http:/ 客户端便发送给php.MVC 应用程序一个请求。应用程序框架的控制器处理这个请求,分析查询字符串,取出请求路径关键字。在这个实例中,路径为 sal
13、esReport。后面我们将看到如何通过 XML配置文件来配置必需的应用行为,绑定表单验证,业务逻辑处理和显示组件。如果我们想严格控制只有通过验证的人才能访问这个报表,则用户必须先输入基本的验证信息,通常是用户名和密码。为了限制只有通过了验证的用户才能访问该报表,这里用了一个被称作 ActionForm 的类,我们需要继承框架的 ActionForm 来定义自己的表单验证类,比如 SalesActionForm,如下所示:class SalesActionForm extends ActionForm . .在 SalesActionForm 类里我们要检查用户是否可信任的以决定下一步动作。如
14、果用户没有通过验证,我们将重定向到初始页面要求重新输入;如果他通过了验证,控制器会通过 Action 类来调用业务处理类。我们通过继承框架 Action 类来进行自定义,比如 SalesAction,如下所示:class SalesAction extends Action . .在 XML 配置文件中我们要定义请求与 Action 类的对应关系,这样控制器找到相应的Action 类,这里调用 SalesAction。在 SalesAction 类里我们能访问业务处理类和数据源。本例中我们从数据库中取得销售数据,制成报表格式。例如:我们创建一些对象,后面在销售报表模板中可以使用这些对象,如下所
15、示:/ Sales report items - per zone (individual object instances):$item1 = new Item(Northern Zone Sales , $salesNorth);$item2 = new Item(Southern Zone Sales , $salesSouth);.当我们完成了销售报表,就要通过控制器指定显示组件显示出来。这是通过一个在XML 配置文件中已经配置好的被称作 Forward 的对象的来完成,如下所示:return $mapping-findForwardConfig(salesReportSuccess)
16、;Forward 对象包含了销售报表模板的路径,比如 salesReport.tpl,这也是在配置文件中定义。然后控制器将请求转向到 ActionDispatcher,由它定向到指定的显示组件,在本例中是 salesReport.tpl,在模板中通过访问先前定义对象和变量从而得到在 SalesAction 里准备好的数据。下面显示我们如何用 phpTAL 模板系统访问报表数据并生成显示视图,对象$item1我们用类变量$item1-value.Sales report-value will appear here.最后将处理结果通过 HTTP 发送到客户端浏览器,从而也就完成了整个处理过程。五
17、、php.MVC 系列教程之目录文件现在让我们来分析一个典型的 php.MVC Web 应用程序的结构。图 3 显示了如何布置一个 php.MVC 应用程序和其核心类库图 3php.MVC 类库从上图我们可以看到 php.MVC 类库被安装在服务器的 DEV 目录下,这个目录用来放置一些通用类库。为了安全起见,该目录不允许 Web 用户访问,因此最好不要将该目录建立在 Web 根目录。如果由于某种原因需要将 php.MVC 类库安装在 Web 根目录,那你必须用.htaccess 文件来控制其访问对象。下面显示的是 Apache 的.htaccess 文件# options the .htac
18、cess files in directories can override.# Edit apache/conf/httpd.conf to AllowOverride in .htaccess# AllowOverride AuthConfig# Stop the directory list from being shownOptions -Indexes# Controls who can get stuff from this server.Order Deny,AllowDeny from allAllow from localhost这将指示 Apache 服务器拒绝所有人访问包
19、含有该.htaccess 的目录及其子目录,在本例中是 php.MVC类库的/WEB-INF 目录下包含的文件及子目录。允许从服务器主机可以访问,这允许使用 Web 服务器的开发者能够浏览该类库下的测试目录以及执行单元测试。php.MVC 文件不必做任何修改即可正常使用,为了能够访问到类库文件,我们需要在 Web 应用程序的 Main.php 文件中设置 php.MVC 类库根目录 ,如下所示:$appServerRootDir = D:/Dev/PHP/phpmvc-base; / no trailing slashphp.MVC Web 应用程序从图 3 我们可以看出一个 Web 应用程序
20、目录 SalesReport 被放置在 Web 根目录WWW 下。在 SalesReports 下的一级目录下我们可以看到几个目录和 Main.php 文件,art 目录用来存放应用图像,style 目录用来存放样式表,这两个目录可以通过 Web 访问,并且可以根据实际需要重新命名,我们能够在模板文件中访问这些资源,如下所示:接下来是 WEB-INF 目录,该目录存放应用类和资源。它不能通过 Web 访问,这是通过.htaccess 文件来实现的。开发者可以在该目录下自由创建目录及子目录,但需要在WEB-INF 目录下的 ModulePaths.php 中声明。在 WEB-INF 目录下,cl
21、ass 目录用来存放应用类和资源文件,tpl 目录用来存放显示资源,比如网页模板。在 WEB-INF 目录下还有 .htaccess,ModulePaths.php, phpmvc-config.xml, phpmvc-config_1_1.dtd, phpmvc-config.data and prepend.php files。其中.htaccess 文件已经在前面讨论过了。ModulePaths.php 文件用来定义指定应用类及资源的路径,我们可以象下面一样定义:$appDirs = array();$appDirs = ; / starting with the sub-applica
22、tion home directory$appDirs = WEB-INF;$appDirs = WEB-INF/classes;$appDirs = WEB-INF/tpl;phpmvc-config.xml 文件是 php.MVC 应用程序的中心组件,可以通过 XML 来定义应用程序的行为和属性,在后面将有更为详细的介绍。phpmvc-config_1_1.dtd 文件是 phpmvc-config.xml 的文档类型定义文件,DTD 文件指定了在 phpmvc-config.xml 文件中可以包含的节点,它是应用程序行为和属性的最终参照。大部分 XML 编辑器都可以用 DTD 文件来验证
23、 phpmvc-config.xml 文件的有效性。phpmvc-config.data 文件包含了应用程序的一些配置数据,这些配置数据是根据phpmvc-config.xml 文件的最新信息动态生成的。假如你的应用程序得不到期望结果时,可以在 phpmvc-config.xml 中增加空格键以修改它,重新运行应用程序时配置数据就会被重新生成。prepend.php 文件常用来包含应用文件,前面,我们已经包含了应用类和模板文件,我们可以用它来包含其他类和资源文件,如下:include_once Locale.php;include_once PropertyMessageResources.p
24、hp; Main.php 就是 php.MVC 应用程序的那个单一入口点,它被放置在应用程序根目录。所有的请求都需要通过它来完成。从上面我们可以看出,Main.php 文件中必须定义 php.MVC 类库的路径$appServerRootDir = D:/Dev/PHP/phpmvc-base; / no trailing slash接下来我们将指定应用程序路径$moduleRootDir = C:/WWW/SalesReports; / no trailing slash我们也可以设置应用程序的 ActionDispatcher 路径。每个 php.MVC 应用程序通常都要自定义一个Acti
25、onDispatcher 来处理指定的请求,我们需要定义 ActionDispatcher 变量,如下所示:$actionDispatcher = ReportActionDispatcher;$osType 变量用于指定 php.MVC 所在主机的操作系统类型,通常框架能够自动检测出来并以此来设置应用路径,但是如果你的应用程序运行出现路径错误,请手工设置该变量。如下所示:$osType = UNIX;正常情况下,包含在 Main.php 中的其它参数可以不做修改。六、php.MVC 系列教程之对象关系图 4 显示了从开发者的角度来看 php.MVC 示例程序中主要类和资源,以及它们之间的关系
26、。图 4在上图左上角是 ActionForm 类,我们通过继承它来处理 HTML 表单验证和与之相关的功能。示例中通过继承 ActionForm 定义了一个基类 AbstractBaseForm,它包含一些通用的逻辑,可以为更多的应用程序 ActionForm 类所引用, 比如 SalesReportForm 类就具体实现了 AbstractBaseForm 类。在上图上方是 Action 类,通常用来处理通过 ActionForm 类完成了初始化验证的请求。我们再次看到了继承 Action 定义的基类 AbstractBaseAction,SalesReportAction 类继承Abstr
27、actBaseAction 用来处理请求,在 SalesReportAction 类中我们能调用业务逻辑类ReportBusinessClass,访问数据库和其他资源。在上图下方是 ActionDispatcher 类,负责为 Action 请求准备显示资源如网页模板。通常,我们需要继承框架 ActionDispatcher 类来定义自己的 Dispatcher,比如示例中的ReportActionDispatcher。在后面我们将有更为详细的介绍七、php.MVC 系统教程之配置文件 前面我们讲解了 php.MVC 的结构以及流程,接下来,我们将重点介绍以下的核心组件: XML 配置文件是
28、php.MVC 应用程序的“ 配电盘 ”,为 HTTP 请求绑定组件。 Controller 由一些框架类组成,负责为 HTTP 请求找到正确的 Form 和 Action 类以及显示资源,在 phpmvc-config.xml 文件中定义。 ActionForm 类通常用来处理 Web 表单验证。 Action 类可以访问业务处理类,能让我们把精力放在应用程序业务流上。 ActionDispatcher 类操纵显示资源的处理。 XML 应用程序配置系统phpmvc-config.xml 文件是 php.MVC 应用程序主要的配置组件,每个 php.MVC 应用程序都有自己的 phpmvc-c
29、onfig.xml 文件,通常位于 WEB-INF 目录下。一旦这个文件被修改,Controller 就会调用 XML 解析器解析该文件,将 XML 节点转化为配置对象,这些配置对象缓存在 phpmvc-config.data 文件中,通常它也是放在与 phpmvc-config.xml 相同的目录。在后面的请求中,Controller 将会调入缓存的 phpmvc-config.data 文件,保存处理时间。图 5 显示了一个典型的 phpmvc-config.xml 文件的节点和属性。在图 5 我们看到了配置文件与应用程序组件是如何联系起来的,我们为 action 节点定义了一个 path
30、 属性为 salesReport,这个标识就是 Action 的访问路径如:http:/ action 节点中 name 属性为 salesReportForm,这就告诉 Controller 我们要用一个名为 salesReportForm 的 form-bean 来处理表单验证,我们能看到名为 salesReportForm的 form-bean 在 action-mappings 节点上面的 form-bean 内定义了,其中 validate 属性为true 表示控制器会调用 form-bean 的 validate(.)方法。在 action 节点和与其联系的 form-bean 节
31、点中,都有 type 属性。我们用这个属性定义 form-bean 和 action 各自对应的类。比如 action 节点就定义了 Action 类为SalesReportAction,form-bean 节点的 ActionForm 类为 SalesReportForm。接下来我们还需要在 action 节点中定义 forward 节点组来指定框架显示组件的 URI,其中 name 属性为 forward 节点定义一个标识, path 属性定义了与这个 action 相关联的资源或模板。示例中第一个 forward 节点定义为 salesReportSuccess,资源路径为salesRe
32、port.tpl,第二个定义为 salesReportFailure,资源路径为 salesReportIndex.tpl,在我们的类里我们能用这些 forward 节点指定显示资源的位置。在这个实例中,假如报表成功生成,我们用 salesReportSuccess 对象和它所定义的 salesReport.tpl 来处理请求,如果报表生成失败,我们用 salesReportFailure 对象和 salesReportIndex.tpl 来处理,一般是返回到初始页。phpmvc-config.xml 文件可以用一般的文本编辑器就可以修改,或者用专用 XML 编辑器。专用 XML 编辑器可以使
33、用 phpmvc-config_1_1.dtd 来验证该配置文件的有效性,DTD文件定义在 XML 文件可是使用的元素,属性以及数值。关于这方面的知识可以查阅 XML的相关资料。下面是示例 phpmvc-config.xml 文件: XML Configurations and Bindings: phpmvc-config.xml八、php.MVC 系列教程之控制器控制器(Controller)由一些类组成,根据预先定义的配置选项处理用户请求。一个典型的用户请求如下:http:/ 控制器由两部分组成:前端控制器和控制器。当请求到来时,前端控制器负责安装应用程序,控制器则根据 phpmvc-c
34、onfig.xml 的配置属性处理请求。图 6 显示了前端控制器的主要任务。图 6用户请求被 Main.php 文件接收,这里,将设置一些初始化参数。前端控制器将执行以下任务: 定义应用程序路径:这将指定 php.MVC 类库以及 Web 应用程序的路径,如下:$appServerRootDir = C:/WWW/phpmvc-base;$moduleRootDir = C:/WWW/mycompany; 定义应用程序的 ActionDispatcher:我们通常需要扩展框架 ActionDispatcher 来定义自己的 Dispatcher 类:$actionDispatcher = My
35、ActionDispatcher; 初始化应用程序类路径:为了将类和资源装入,前端控制器将导入预先定义的全局路径以及应用程序路径。我们可以在/WEB-INF/ModulePaths.php 中设置路径,如下:$appDirs = array();.$appDirs = WEB-INF/report_tpl;$appDirs = WEB-INF/report_classes; 包含应用程序类:前端控制器将导入它所需要的类文件,我们也可以用/WEB-INF/prepend.php 文件来有选择性地导入一些特殊的应用程序类文件。如下:include_once ./WEB-INF/mytools/My
36、Tools.php; 配置应用程序:前端控制器将为应用程序设置配置信息,比如我们先前定义的ActionDispatcher。 初始化控制器:前端控制器现在将创建一个应用服务器实例(ActionServer)。 导入配置信息:前端控制器现在将导入应用程序配置信息,假如 phpmvc-config.xml 从最后一次请求后被修改了,phpmvc-config.xml 文件将被重新处理并将数据缓存到/WEB-INF/phpmvc-config.data 中。 初始化 HTTP 请求:前端控制器现在将设置 HTTP 请求并添加请求属性。 调用应用程序控制器:前端控制器现在已经完成了准备工作,将会把处理
37、权交给控制器。 控制器接收从前端控制器传来的请求,根据配置属性执行一系列操作。图 7 描述了 php.MVC 控制器的任务。图 7 处理 action 路径:控制器将根据请求路径识别出关键字,选择一个 action 映射。比如请求路径为:http:/ action 路径就为salesReport。 处理现场:根据需要为当前用户选择一个 Locale 处理内容格式:根据需要设置内容格式,默认为 text/html。 处理不缓存:根据需要设置不缓存头信息,默认为:“Pragma“, “No-cache“Cache-Control“, “no-cache“Expires“, 1 处理预处理任务:可以
38、在自定义的 ActionServer 子类中覆盖这个方法,执行一些指定的预处理任务。 处理 Action 映射:控制器将根据请求识别 action 映射,根据 phpmvc-config.xml的相应节点生成 action 映射对象(ActionConfig) ,比如: 。 处理角色:检查能执行这个 action 的所有必须的认证。 处理 ActionForm:控制器将根据 action 映射找到相关联的 ActionForm,form-bean就是由 action 的 name 属性指定,比如:。 处理 Populate:根据请求参数设置 ActionForm 实例的属性。 验证 Actio
39、nForm:根据 action 的 validate 属性值如:,决定是否调用 ActionForm 的 validate()方法。如果 validate()返回 False(验证失败),控制器将用 action 中 input 属性所指定的显示资源( 模板)显示错误,比如: 假如 validate()返回 True(验证通过 ),则将继续处理。处理 Forward:控制器检查 forward映射的 URI 是否正常,如果是,继续处理。 处理 Include:控制器检查 include 映射的 URI 是否正常,如果是,继续处理。 处理 Action 创建:控制器将创建或获取 Action 实
40、例来处理这个请求,这是用action 的 type 属性来定义的,比如:execute(.)。在该方法内,我们将调用业务处理逻辑类。 处理 Action 链:控制器将检查是否还有另外一个 Action 需要处理,在应用程序配置文件中,我们通过 ActionChain 能定义一系列 Action,为了定义 ActionChain,需要为action 节点的 forward 元素添加一个 nextActionPath 属性,比如:. forward 元素的 path 属性是必须项,假如这个特殊的 Action 没有输出,我们可以设置 path = “。 处理 Action Forward:控制器将转发或重定向到指定的资源,一个 forward 请求在当前处理器中被处理。RequestProcessor 只是把控制权交给 ActionDispatcher,那里包含了指定的 URI 模板。比如: 重定向请求实际是发送给客户端浏览器一个标头响应,然后重定向到一个新的URL。在发送重定向标头信息时当前的处理将立即终止。假如没有其他的 Action 需要处理,控制器处理结束。