ThinkPHP的执行过程和MVC特性(转) » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

ThinkPHP的执行过程和MVC特性(转)

和很多应用框架一样,ThinkPHP也采用了MVC模式和单一入口模式。


  1. 模型(M):模型的定义由Model类来完成。Model类位于项目目录下面的LibModel目录。
  2. 控制器(C):应用控制器(核心控制器)和Action控制器都承担了控制器的角色,区别在于Action控制器完成业务过程,而应用控制器(App类)负责调度控制。Action控制器位于项目目录下面的LibAction目录。
  3. 视图(V):模板的实现是和框架无关的,做到了100%分离,可以独立预览和制作。模板目录位于项目目录下面的Tpl目录。

执行过程
ThinkPHP采用模块和操作的方式来执行,首先,用户的请求会通过入口文件生成一个应用实例,应用控制器(我们称之为核心控制器)会管理整个用户执行的过程,并负责模块的调度和操作的执行,并且在最后销毁该应用实例。任何一个WEB行为都可以认为是一个模块的某个操作,而模块的概念在ThinkPHP中的体现就是Action类,也类似于我们平常提到控制器的概念,而具体的操作就是Action类中的某个公共的方法。

ThinkPHP里面会根据当前的URL来分析要执行的模块和操作。这个分析工作由URL调度器来实现,官方内置了Dispatcher来完成该调度。在Dispatcher调度器中,会根据

代码:

  1. http://servername/appName/moduleName/actionName/params

来获取当前需要执行的项目(appName)、模块(moduleName)和操作(actionName),在某些情况下,appName可以不需要(通常是网站的首页,因为项目名称可以在入口文件中指定,这种情况下,appName就会被入口文件替代)
每个模块名称是一个Action文件,类似于我们平常所说的控制器,系统会自动寻找项目类库Action目录下面的相关类,如果没有找到,会尝试搜索应用目录下面的组件类中包含的模块类,如果依然没有,则会判断是否存在空模块(EmpatyAction),否则抛出异常。
而actionName操作是首先判断是否存在Action类的公共方法,如果不存在则会继续寻找父类中的方法,如果依然不存在,就会判断是否存在空操作 (_empty),然后就会寻找是否存在自动匹配的模版文件。如果存在模版文件,那么就直接渲染模版输出,否则将抛出异常。
因此应用开发中的一个重要过程就是给不同的模块定义具体的操作。一个应用如果不需要和数据库交互的时候可以不需要定义模型类,但是必须定义Action控制器。
Action控制器的定义非常简单,只要继承Action基础类就可以了,例如:

代码: 复制内容到剪贴板

  1. Class UserAction extends Action{
  2. }

你甚至不需要定义任何操作方法,就可以完成很多默认的操作,因为Action基础类已经为你定义了很多常用的操作方法。例如,我们可以执行(如果已经存在对应模板文件的情况)

代码: 复制内容到剪贴板

  1. http://servername/index.php/User/
  2. http://servername/index.php/User/add

如果你需要增加或者重新定义自己的操作方法,增加一个方法就可以了,例如

代码:

  1. Class UserAction extends Action{
  2. // 定义一个select操作方法,注意操作方法不需要任何参数
  3. Public function select(){
  4. // select操作方法的逻辑实现
  5. // ……
  6. $this->display(); // 输出模板页面
  7. }
  8. }

我们就可以执行http://servername/index.php/User/select/了,系统会自动定位当前操作的模板文件
而默认的模板文件应该位于项目目录下面的Tpl\default\User\select.html

Tagged in :

All Comments (0)
Gravatar image
No Comments