ThinkPHP学习笔记(2)ThinkPHP运行流程

来源:互联网 发布:js数组复制extend 编辑:程序博客网 时间:2024/06/08 02:35

在学习笔记1中,我们已经为项目配置好了ThinkPHP框架。在第一次输入浏览器浏览项目后,ThinkPHP框架会自动为index项目(前台项目)创建index文件夹,并在文件夹下生成了如下目录:



由于开启了ThinkPHP的调试模式,所以会有缓存目录产生,否则则没有该目录。

那么,框架是如何通过url路由到对应页面并显示的呢?别急,我们先了解下ThinkPHP的设计模式MVC。

MVC模式算是比较著名的一种架构设计,MVC即

M —— Module 模型

V —— View 视图

C —— Control 控制器


通过这种模式,我们可以将整个网站认成 一种对数据的表达方式(毕竟,我们看到的任何网页,都是后台数据的体现)。MVC就可理解为 网页,是一种对数据(Module)的可视化表现(View)。而建立这种数据与表现之间的桥梁的,则是控制器(Control)。


对应的ThinkPHP将代码也分做Module,View和Control。


当在浏览器输入url的时候,ThinkPHP会自动在url的提交参数中,解析出对应的控制器Control,及控制器应该调用的函数名称。

ThinkPHP的url解析规则如下

http://网址/?m=控制器名称&a=控制器要调用的方法名称


例如 url

http://127.0.0.1/think/index.php?m=Show&a=add    则会调用控制器ShowAction的add()方法来显示页面。

但在第一篇笔记中,我们没有传任何网页名称,同时没有传任何参数,直接输入

http://127.0.0.1/think/

是怎么显示出内容的呢?

答案很简单,在没有任何网页或参数的情况下, ThinkPHP默认会访问index.php网页,同时,调用默认控制器IndexAction的index方法。

上面的情况,其实类似于以下php代码

<?php<span style="white-space:pre"></span>$control = isset($_GET['m'])?$_GET['m']:'IndexAction';$action = isset($_GET['a']) ? $_GET['a']:'index';$obj = new $control;$obj->$action();?>

那么,ThinkPHP的控制器类都是写在那些文件中,并存在于那个目录下呢?

TP(ThinkPHP)的控制器类文件, 都被放在了自动生成目录的 Lib/Action/目录下,默认的,你会看到TP自动生成的一个控制器文件

IndexAction.class.php

打开该文件,其代码类似如下

<?php// 本类由系统自动生成,仅供测试用途class IndexAction extends Action {    public function index(){    echo "Hello World";    }   }


很明显,对应url的m参数 m=Index,控制器类的命名应该为IndexAction,且所有的控制器类都应该继承自统一父类Action 

而控制器类文件的命名也有讲究,为 

控制器类名.class.php。


我们之后再添加控制器类,同样应该将文件放在Lib/Action/目录下,并遵循同样的文件命名及代码规则。

例如我们在添加一个Show控制器,如图所示。



那么,我们在浏览器中输入

http://127.0.0.1/think/?m=Show&a=add  或 http://127.0.0.1/think/index.php?m=Show&a=add 

框架就会调用ShowAction控制器的add方法进行显示。(注意,这里url中输入的是m=Show而不应该是m=ShowAction


而控制器类中的这些方法的意义是什么呢?其实控制器中的每个方法,均可以理解为一个页面的展示方法。即你有多少个控制器类方法,就应该有多少个页面可以展示。但是,由于为了提高网站代码的逻辑性,我们不可能将所有的页面展示逻辑都写在同一个控制器类中(虽然理论上完全可以这么做)。因此我们会建立若干个控制器类文件,来分别对应网站的不同页面。

0 0
原创粉丝点击