注意:下文的application文件夹简写为app文件夹
一、TP架构的概述
thinkphp 使用MVC模式,它强制性的使应用程序的输入、处理和输出分开,使用MVC程序被分成三个核心部件:模型(M)、视图(V)、控制器(C),他们各自处理自己的任务。
二、url解析
http://www.tp.com/index.php/Index/index/index
协议/域名/入口文件/模块/控制器/方法
1.应用
一个应用代表一个网站
2.入口文件
文件地址:应用\public\index.php
作用:负责处理请求
3.模块(以前台为例)
模块地址:app\index
作用:网站所有的前台相关都与其相关
新建模块:在app目录下创建admin文件夹,并在文件夹中创建model、view、controller文件夹,在controller文件夹中创建控制器,方法见4.控制器
4.控制器
控制器目录:app\index\controller
作用:书写业务逻辑
新建控制器(以前台为例)
- 在前台控制器目录(app\index\controller)下新建User.php
- 在控制器中书写代码
<?php
// 声明命名空间(我理解为声明该文件所在的位置)
namespace app\index\controller;
// 声明控制器
class User
{
function index()
{
echo 'user控制器下的index方法';
}
}
?>
3.地址栏访问
http://www.tp.com/index.php/index/User/index
4.注意:
- 1.控制器的文件名必需首字母大写
- 2.控制器中必需声明命名空间
- 3.控制器中的类名必需和文件名一致
5、操作(方法)
1.操作地址
操作一般都在控制器的文件中
2.新建一个操作(以前台index控制器为例)
1.打开前台index控制器(app\index\controller\Index.php)
2.在控制器新建test方法
public function test()
{
return "我是用户自己创建的方法";
}
3.地址栏访问
http://www.tp.com/index.php/index/Index/test
6.模型(数据模型)
1.数据模型地址(app\index\model)
2.作用:负责数据库相关的处理
7.视图(页面)
1.页面地址(app\index\view)
2.作用:其实就是网站页面
三、命名空间
与目录相关(以前台index控制器为例)
项目\app\index\controller的命名空间是
namespace app\index\controller;
四、跨控制器调用
1.调用当前模块的其他控制器
// 调用当前模块的其他控制器
function diaoyong(){
// 方法一:使用命名空间
$model=new \app\index\controller\User;
$model->index();
// 方法二:使用use,在开头处加上use \app\index\controller\User;
$model=new User;
$model->index();
// 方法三:使用系统方法
$model=controller('User');
$model->index();
}
2.调用其他模块的控制器中的方法
// 调用其他模块的控制器中的方法
function diaoyongs(){
// 方法一:使用命名空间
$model=new \app\admin\controller\User;
$model->index();
echo '<hr>';
// 方法二:使用use,在开头处加上use \app\admin\controller\User as AdminUser;
$model=new AdminUser;
$model->index();
echo '<hr>';
// 方法三:使用系统方法
$model=controller('admin/User');
$model->index();
}
五、调用方法
1. 调用当前控制器的方法
// 调用当前控制器的方法
function fangfa(){
// 方法一(this指向当前控制器)
$this->diaoyongs();
// 方法二(self指向当前控制器)
self::diaoyongs();
// 方法三(直接使用当前控制器)
Index::diaoyongs();
// 方法四(action)
action('diaoyongs');
}
2. 调用其他控制器的方法
// 调用其他控制器中的方法
public function fangfas(){
// 方法一
$model=new \app\index\controller\User;
$model->index();
echo '<hr>';
// 方法二
action('User/index');
}
3. 调用模块下的方法
// 调用其他模块中的方法
public function mokuai(){
// 方法一
$model=new \app\admin\controller\User;
$model->index();
echo '<hr>';
// 方法二
action('admin/User/index');
}
六、主要分析TP执行流程
1. 入口文件(项目\public\index.php)
作用:
- 定义目录常量
- 加载框架的引导目录
2. 加载框架的引导文件(项目\thinkphp\start.php)
作用:
1. 引导基础文件
2. 对应用进行运转
3. 加载框架的基础引导文件(项目\thinkphp\base.php)
作用:
1. 加载系统常量
2. 载入Loader类(项目\thinphp\library\think\loader.php)
3. 引入环境变量
4. 注册自动加载机制
5. 注册异常处理机制(项目\thinkphp\library\think\Error.php)
6. 加载惯例配置(项目\thinkphp\convention.php)
4. 运行应用(项目\thinkphp\library\think\App.php)下的run方法
- 第一步:加载当前控制器中的initCommon()
- 第二步:加载当前控制器的init()方法 ,加载各种配置文件,加载公共文件,加载语言包
- 第三步:设置时区
- 第四步:加载当前控制器 routeCheck()方法:路由检测
- 第五步:调用控制器中的exec()方法:根据用户的请求进行分发处理
- 第六步:根据不同的请求类型加载对应的文件 module方法,加载对应的控制器和对应的方法
5. 响应输出:用户看到的所有界面就加载出来了