Sales report->value will appear here

...

最后将处理结果通过HTTP发送到客户端浏览器,从而也就完成了整个处理过程。

五、 php.MVC系列教程之目录文件

现在让我们来分析一个典型的php.MVC Web应用程序的结构。

图3显示了如何布置一个php.MVC应用程序和其核心类库

php.MVC类库

从上图我们可以看到php.MVC类库被安装在服务器的DEV目录下,这个目录用来放置一些通用类库。为了安全起见,该目录不允许Web用户访问,因此最好不要将该目录建立在Web根目录。如果由于某种原因需要将php.MVC类库安装在Web 根目录,那你必须用.htaccess文件来控制其访问对象。

下面显示的是Apache的.htaccess文件

# options the .htaccess files in directories can override.

# Edit apache/conf/httpd.conf to AllowOverride in .htaccess

# AllowOverride AuthConfig

# Stop the directory list from being shown

Options -Indexes

# Controls who can get stuff from this server.

Order Deny,Allow

Deny from all

Allow from localhost

这将指示Apache服务器

拒绝所有人访问包含有该.htaccess的目录及其子目录,在本例中是php.MVC类库的/WEB-INF目录下包含的文件及子目录。

允许从服务器主机可以访问,这允许使用Web 服务器的开发者能够浏览该类库下的测试目录以及执行单元测试。

php.MVC文件不必做任何修改即可正常使用,为了能够访问到类库文件,我们需要在Web应用程序的Main.php文件中设置php.MVC类库根目录,如下所示:

$appServerRootDir = 'D:/Dev/PHP/phpmvc-base'; // no trailing slash

php.MVC Web应用程序

从图3我们可以看出一个Web应用程序目录SalesReport被放置在Web根目录WWW下。

在SalesReports下的一级目录下我们可以看到几个目录和Main.php文件,art目录用来存放应用图像,style目录用来存放样式表,这两个目录可以通过Web访问,并且可以根据实际需要重新命名,我们能够在模板文件中访问这些资源,如下所示:

接下来是WEB-INF目录,该目录存放应用类和资源。它不能通过Web访问,这是通过.htaccess文件来实现的。开发者可以在该目录下自由创建目录及子目录,但需要在WEB-INF目录下的ModulePaths.php中声明。在WEB-INF目录下,class目录用来存放应用类和资源文件,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-application 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文件来验证phpmvc-config.xml文件的有效性。

phpmvc-config.data文件包含了应用程序的一些配置数据,这些配置数据是根据phpmvc-config.xml文件的最新信息动态生成的。假如你的应用程序得不到期望结果时,可以在phpmvc-config.xml中增加空格键以修改它,重新运行应用程序时配置数据就会被重新生成。

prepend.php文件常用来包含应用文件,前面,我们已经包含了应用类和模板文件,我们可以用它来包含其他类和资源文件,如下:

include_once 'Locale.php';

include_once 'PropertyMessageResources.php';

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应用程序通常都要自定义一个

ActionDispatcher来处理指定的请求,我们需要定义ActionDispatcher变量,如下所示:

$actionDispatcher = 'ReportActionDispatcher';

$osType变量用于指定php.MVC所在主机的操作系统类型,通常框架能够自动检测出来并以此来设置应用路径,但是如果你的应用程序运行出现路径错误,请手工设置该变量。如下所示:

$osType = 'UNIX';

正常情况下,包含在Main.php中的其它参数可以不做修改。

六、 php.MVC系列教程之对象关系

图4显示了从开发者的角度来看php.MVC示例程序中主要类和资源,以及它们之间的关系。

在上图左上角是ActionForm类,我们通过继承它来处理HTML表单验证和与之相关的功能。示例中通过继承ActionForm定义了一个基类AbstractBaseForm,它包含一些通用的逻辑,可以为更多的应用程序ActionForm类所引用,比如SalesReportForm类就具体实现了AbstractBaseForm类。

在上图上方是Action类,通常用来处理通过ActionForm类完成了初始化验证的请求。我们再次看到了继承Action定义的基类AbstractBaseAction,SalesReportAction类继承AbstractBaseAction用来处理请求,在SalesReportAction类中我们能调用业务逻辑类ReportBusinessClass,访问数据库和其他资源。

在上图下方是ActionDispatcher类,负责为Action请求准备显示资源如网页模板。通常,我们需要继承框架ActionDispatcher类来定义自己的Dispatcher,比如示例中的ReportActionDispatcher。

在后面我们将有更为详细的介绍 七、 php.MVC系统教程之配置文件

前面我们讲解了php.MVC的结构以及流程,接下来,我们将重点介绍以下的核心组件: XML配置文件是php.MVC应用程序的“配电盘”,为HTTP请求绑定组件。 Controller由一些框架类组成,负责为HTTP请求找到正确的Form和Action类以及显示资源,在 phpmvc-config.xml文件中定义。 ActionForm类通常用来处理Web表单验证。 Action类可以访问业务处理类,能让我们把精力放在应用程序业务流上。 ActionDispatcher类操纵显示资源的处理。

XML应用程序配置系统

phpmvc-config.xml文件是php.MVC应用程序主要的配置组件,每个php.MVC应用程序都有自己的phpmvc-config.xml文件,通常位于WEB-INF目录下。一旦这个文件被修改,Controller就会调用XML解析器解析该文件,将XML节点转化为配置对象,这些配置对象缓存在phpmvc-config.data文件中,通常它也是放在与phpmvc-config.xml相同的目录。在后面的请求中,Controller将会调入缓存的phpmvc-config.data文件,保存处理时间。

在图5我们看到了配置文件与应用程序组件是如何联系起来的,我们为action节点定义了一个path属性为salesReport,这个标识就是Action的访问路径如:http://www.myhost.com/mycompany/Main.php?do=salesReport.

在action节点中name属性为salesReportForm,这就告诉Controller我们要用一个名为salesReportForm的form-bean来处理表单验证,我们能看到名为salesReportForm的form-bean在action-mappings节点上面的form-bean内定义了,其中validate属性为true表示控制器会调用form-bean的validate(...)方法。

在action节点和与其联系的form-bean节点中,都有type属性。我们用这个属性定义form-bean和action各自对应的类。比如action节点就定义了Action类为SalesReportAction,form-bean节点的ActionForm类为SalesReportForm。

接下来我们还需要在action节点中定义forward节点组来指定框架显示组件的URI,其中name属性为forward节点定义一个标识,path属性定义了与这个action相关联的资源或模板。示例中第一个forward节点定义为salesReportSuccess,资源路径为salesReport.tpl,第二个定义为salesReportFailure,资源路径为salesReportIndex.tpl,在我们的类里我们能用这些forward节点指定显示资源的位置。在这个实例中,假如报表成功生成,我们用salesReportSuccess对象和它所定义的salesReport.tpl来处理请求,如果报表生成失败,我们用salesReportFailure对象和salesReportIndex.tpl来处理,一般是返回到初始页。

phpmvc-config.xml文件可以用一般的文本编辑器就可以修改,或者用专用XML编辑器。专用XML编辑器可以使用phpmvc-config_1_1.dtd来验证该配置文件的有效性,DTD文件定义在XML文件可是使用的元素,属性以及数值。关于这方面的知识可以查阅XML的相关资料。

下面是示例phpmvc-config.xml文件: XML Configurations and Bindings: phpmvc-config.xml

八、 php.MVC系列教程之控制器

控制器(Controller)由一些类组成,根据预先定义的配置选项处理用户请求。一个典型的用户请求如下:

http://www.myhost.com/mycompany/Main.php?do=salesReport.

php.MVC 控制器由两部分组成:前端控制器和控制器。当请求到来时,前端控制器负责安装应用程序,控制器则根据phpmvc-config.xml的配置属性处理请求。

用户请求被Main.php文件接收,这里,将设置一些初始化参数。前端控制器将执行以下任务: 定义应用程序路径:这将指定php.MVC类库以及Web应用程序的路径,如下:

$appServerRootDir = 'C:/WWW/phpmvc-base';

$moduleRootDir = 'C:/WWW/mycompany'; 定义应用程序的ActionDispatcher:我们通常需要扩展框架ActionDispatcher来定义自己的Dispatcher类:

$actionDispatcher = 'MyActionDispatcher'; 初始化应用程序类路径:为了将类和资源装入,前端控制器将导入预先定义的全局路径以及应用程序路径。我们可以在/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/MyTools.php'; 配置应用程序:前端控制器将为应用程序设置配置信息,比如我们先前定义的ActionDispatcher。 初始化控制器:前端控制器现在将创建一个应用服务器实例(ActionServer)。 导入配置信息:前端控制器现在将导入应用程序配置信息,假如phpmvc-config.xml从最后一次请求后被修改了,phpmvc-config.xml文件将被重新处理并将数据缓存到/WEB-INF/phpmvc-config.data中。 初始化HTTP请求:前端控制器现在将设置HTTP请求并添加请求属性。 调用应用程序控制器:前端控制器现在已经完成了准备工作,将会把处理权交给控制器。

控制器接收从前端控制器传来的请求,根据配置属性执行一系列操作。

处理action路径:控制器将根据请求路径识别出关键字,选择一个action映射。比如请求路径为:

http://www.myhost.com/mycompany/Main.php?do=salesReport, action路径就为salesReport。 处理现场:根据需要为当前用户选择一个Locale 处理内容格式:根据需要设置内容格式,默认为text/html。 处理不缓存:根据需要设置不缓存头信息,默认为:

"Pragma", "No-cache"

"Cache-Control", "no-cache"

"Expires", 1 处理预处理任务:可以在自定义的ActionServer子类中覆盖这个方法,执行一些指定的预处理任务。 处理Action映射:控制器将根据请求识别action映射,根据phpmvc-config.xml的相应节点生成action映射对象(ActionConfig),比如:。 处理角色:检查能执行这个action的所有必须的认证。 处理ActionForm:控制器将根据action映射找到相关联的ActionForm,form-bean就是由action的name属性指定,比如:

。 处理Populate:根据请求参数设置ActionForm实例的属性。 验证ActionForm:根据action的validate属性值如:,决定是否调用ActionForm的validate()方法。如果validate()返回False(验证失败),控制器将用action中input属性所指定的显示资源(模板)显示错误,比如:

...

validate = "true"

input = reportsIndex.tpl>

假如validate()返回True(验证通过),则将继续处理。处理Forward:控制器检查forward映射的URI是否正常,如果是,继续处理。 处理Include:控制器检查include映射的URI是否正常,如果是,继续处理。 处理Action创建:控制器将创建或获取Action实例来处理这个请求,这是用action的type属性来定义的,比如:

type = "SalesReportAction"

... 处理Action执行:控制器现在将调用Action类的execute()方法,比如SalesReportAction->execute(...)。在该方法内,我们将调用业务处理逻辑类。 处理Action链:控制器将检查是否还有另外一个Action需要处理,在应用程序配置文件中,我们通过ActionChain能定义一系列Action,为了定义ActionChain,需要为action节点的forward元素添加一个nextActionPath属性,比如:

type = "SalesReportAction"

...

name = "salesReportSuccess"

path = "salesReport.tpl"

nextActionPath = "salesReport2"/>

... forward元素的path属性是必须项,假如这个特殊的Action没有输出,我们可以设置path = ""。 处理Action Forward:控制器将转发或重定向到指定的资源,一个forward请求在当前处理器中被处理。RequestProcessor只是把控制权交给ActionDispatcher,那里包含了指定的URI模板。比如:

name="forward_path

path="forwardRequest"

redirect="false"/> 重定向请求实际是发送给客户端浏览器一个标头响应,然后重定向到一个新的URL。在发送重定向标头信息时当前的处理将立即终止。

name="redirect_path

path="/MyApp/Main.php?do=newRequest"

redirect="true"/>

name="redirect_path

path="http://www.myhost.com/MyApp/Main.php?do=newRequest"

redirect="true"/>

假如没有其他的Action需要处理,控制器处理结束。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章

相关视频

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

立即提交

专题推荐独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

php中文网:公益在线php培训,帮助PHP学习者快速成长!

Copyright 2014-2020 https://www.php.cn/ All Rights Reserved | 苏ICP备2020058653号-1

php教程mvc,php.MVC教程相关推荐

  1. ASP.NET MVC 5 学习教程:添加控制器

    ASP.NET MVC 5 学习教程:添加控制器 原文 ASP.NET MVC 5 学习教程:添加控制器 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控 ...

  2. ASP.NET MVC Music Store教程(1):概述和新项目

    ASP.NET MVC Music Store教程(1):概述和新项目 转自 http://firechun.blog.163.com/blog/static/31804522201102709374 ...

  3. ASP.NET MVC 5 入门教程 (2) 控制器Controller

    原文:ASP.NET MVC 5 入门教程 (2) 控制器Controller 文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get ...

  4. ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解

    ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 原文 ASP.NET MVC 5 学习教程:Details 和 Delete 方法详解 在教程的这一部分,我们将研究一 ...

  5. ASP.NET MVC 5 学习教程:控制器传递数据给视图

    起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控制器访问模型的数据 生成的代码详解 使用 SQL Se ...

  6. PHP: 手把手编写自己的 MVC 框架实例教程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  7. ASP.NET MVC 5 入门教程 (3) 路由route

    文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-route.html 上一节:ASP.NET MVC 5 入门 ...

  8. ASP.NET MVC Music Store教程(2):控制器

    ASP.NET MVC Music Store教程(2):控制器 转自http://firechun.blog.163.com/blog/static/3180452220110272197830/ ...

  9. MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用

    MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 原文:MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. ...

  10. ASP.NET MVC 5 学习教程:修改视图和布局页

    ASP.NET MVC 5 学习教程:修改视图和布局页 原文 ASP.NET MVC 5 学习教程:修改视图和布局页 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图 ...

最新文章

  1. PHP和Java的联系,PHP和Java的功能
  2. Swift怎么通过类名字符串来创建一个类
  3. django中的中间件执行顺序
  4. 二进制文件更新程序_APR 6.17程序文件更新
  5. 14-Clothes衣服
  6. [转]C#操作注册表
  7. android 获取刘海高度,不同刘海屏幕获取安全高度
  8. [原创]我的网名卖烧烤的鱼缘由^_^
  9. 华为员工离职心声:菊厂15年退休,感恩,让我实现了财务自由!
  10. 纯鼓点节奏_[鼓点] 简单的鼓点节奏
  11. 网站购买空间还是服务器,网站用空间还是服务器
  12. 双子星量子计算机,【前沿】“前途”无量的量子科技
  13. Java中关于空格遇到的一些问题
  14. 【附源码】计算机毕业设计JAVA九宫格日志网站
  15. Toggle Buttons(一)
  16. aria服务器没有响应,aria2服务器错误
  17. 什么是反射 (Reflection)?可以用它做什么?
  18. python目录是什么意思_python是什么(python是什么意思)
  19. 《乔布斯传》圈点(4)
  20. 使用python 520表白吧

热门文章

  1. 2021年软件开发的五大趋势,低代码/无代码得到了验证!
  2. 为什么软件开发这么难?
  3. 国内首个比特币勒索病毒案告破,三年获利 500 万!
  4. 「AI原生」时代来临?百度智能云提出AI-Native,发布新一代云基础架构「太行」
  5. 人工智能时代,AI 并不是为了取代传统教师而生!
  6. 近十年数据库流行趋势纵览!存储计算分离、ACID 全面回归......
  7. ofo 退押金出新招;快手回应“弃拼多多联手阿里”;Julia 1.3 发布 | 极客头条...
  8. 5G 时代的车联网混战!
  9. 鸿蒙操作系统用的微内核到底是什么?
  10. 用故事来给你讲负载均衡的原理