# 殊途同归
http://127.0.0.1/thinkphp5/public <br/>
http://127.0.0.1/thinkphp5/public/index.php <br/>
http://127.0.0.1/thinkphp5/public/index.php/index <br/>
http://127.0.0.1/thinkphp5/public/index.php/index/Index <br/>
http://127.0.0.1/thinkphp5/public/index.php/index/Index/index <br/>
上述五种不同的URL之所以访问结果全部相同,是由于他们本身就是相同的。
原因是:默认值!
### apache的默认值
我们在前面讨论过,当我们不指定文件名的时候,会先找index.html,然后再找index.php,这个是在apache中设置的,也就是apache在起这个作用。
### thinkphp的默认值
在thinkphp中,是通过“入口文件/模块名(module)/控制器名(controller)/触发器名(action)”来确定用户的URL对应执行哪个方法中的语句的。如下图所示:
比如我们进行如下访问:
![](https://box.kancloud.cn/2016-07-02_57778c45815d6.png)
按照ThinkPHP的规定,其实是直接执行了```d:/xampp/htdocs/thinkphp5/public/index.php```这个文件(我们把这个文件叫做入口文件),ThinkPHP的开发团队在这个文件中写了一些特定的代码,这些代码最终自动调用了```d:/xampp/htdocs/thinkphp5/application/index/controller/index.php```中的```index()```方法。
> 至于index.php这件文件是怎么做到调用那个index()方法的,现在我能给出的答案是:自动。其实我们并不需要知道它是怎么调用呢,学会如果使用ThinkPHP才是我们现在的目的。
我们把```application```下面的子文件夹,称为```模块(Module)```,把模块下的```controller```文件夹中的子文件称之为```控制器(Controller)```,把控制器文件中的方法称为```触发器(Action)```。
对于ThinkPHP自动调用的规则,我们用一个比较乱,但却很能说明问题的图来说明一下。
![](https://box.kancloud.cn/2016-07-02_57778a2d19ae8.png)
> 模块:module,控制器:controller,触发器:action。以后我们会越来越多的和它们打交道,每一个URL都会对应着一个触发器,我们有必要多花些精力把MCA弄明白。
1. 当我们未指定模块名时,调用的是默认模块index。
2. 当我们未指定控制器名时,调用的是默认控制器Index(注意,这个是Index,而不是index,原因是控制器实际上是一个类,我们规定类的名字首写字母要大写)。
3. 当我们在URL中未指定触发器名时,调用的是默认触发器index。
### MCA
是的,没有什么深奥的道理。
<code> M </code> = <code>M</code>odule 它对应一个文件夹
<code> C </code> = <code>C</code>ontroller 它对应一个文件
<code> A </code> = <code>A</code>ction 它对应一个方法(它还有几个名字:触发器、函数、function、method)
每个URL都会对应唯一的一组MCA,这组唯一的MCA会执行特定的function。当用户访问一个URL时,就会执行一个对应的function,我们把一些代码写在这个function中,那么相应的功能就实现了。就像我们前面输出hello world一样,是把一些输出hello world的代码放到了index模块下的Index控制器下的 function index()中。
**【注意】**: 我们把这个function又叫做触发器,而且我们仅将Controller中的function叫做触发器,原因大概是由于这个function如果想被执行的话,需要用户输入特定的URL。我们说当用户输入特定的URL后,这个方法被```触发```了,所以叫做触发器。
是的,就是这么简单。
### apache与thinkphp默认值结合
当apache与thinkphp的默认值相结合时,就出现了上述五种URL不同、语句执行结果却相同的情况。
### 其它代码
~~~
<?php
// 该文件位于application\index\controller文件夹中
namespace app\index\controller;
// 我的文件名叫做Index.php,我的名字对应的叫做Index。
class Index
{
// 我的方法名叫index
public function index()
{
return 'Hello World!';
}
}
~~~
### 小练习
**目标1**:访问以下地址,要求输出结果:hello yunzhi。
http://127.0.0.1/thinkphp5/public/index.php/test
**目标2**:访问以下地址,要求输出结果:hi yunzhier。
http://127.0.0.1/thinkphp5/public/index.php/yunzhi/hi/yunzhier
**目标3**:按下图所示创建文件,访问该文件并输出正确结果。
![](https://box.kancloud.cn/2016-06-13_575dfccdde046.png)
~~~
git checkout -f step2.5
~~~
执行上述命令后,本节示例代码信息如下:
目标1实现代码:
![](https://box.kancloud.cn/6a46b23c678edeb048cc1a24569dd7bf_670x232.png)
目标2实现代码:
![](https://box.kancloud.cn/2d700ac1dab8181d16ca559f5bb477c3_688x254.png)
目标3访问网址为:
http://127.0.0.1/thinkphp5/public/index.php/test/hello/luck
或
http://127.0.0.1/thinkphp5/public/test/hello/luck
- 序言
- 第一章 准备知识
- 第一节:XAMPP
- 第二节:NAVICAT
- 第三节:GIT
- 第二章 HelloWorld
- 第一节:下载THINPHP5.0
- 第二节:启动xampp
- 第三节:hello thinkphp
- 第四节:Hello world
- 第五节:MCA
- 第六节:单引号与双引号
- 第三章 教师管理
- 第一节:新建数据库
- 第二节:CURD之R 读数据
- 3.2.1 时序图
- 3.2.2 连接数据库
- 3.2.3 直接读取数据
- 3.2.4 间接读取数据
- 3.2.5 使用V层显示数据
- 3.2.6 引入bootstrap
- 3.2.7 加入bootstrap样式
- 第三节:CURD之 C 增加数据
- 3.3.1 插入数据
- 3.3.2 表单传值
- 3.3.3 存储表单数据
- 3.3.4 自动时间戳
- 3.3.5 增加验证
- 第四节:CURD之 D 删除数据
- 3.4.1 什么是关键字
- 3.4.2 删除数据
- 3.4.3 定制删除链接
- 3.4.4 完善删除
- 第五节:CURD之 U 更新数据
- 3.5.1 读取数据
- 3.5.2 展示数据
- 3.5.3 修改数据
- 3.5.4 传递数据
- 3.5.5 接收数据
- 3.5.6 更新数据 方法一
- 3.5.7 更新数据 方法二
- 第六节:衔接各个action & 重构代码
- 3.6.1 index action
- 3.6.2 add action
- 3.6.3 insert action
- 3.6.4 delete action
- 3.6.5 edit action
- 3.6.6 update action
- 第七节:分页
- 3.7.1 调用内置分页
- 3.7.2 select与paginate(选学)
- 3.7.3 分页原理(选学)
- 3.7.4 调用page(选学)
- 第八节:模糊查询
- 3.8.1 增加查询
- 3.8.2 完善查询
- 第四章 登录与注销
- 第一节:cookie 与 session
- 第二节:静态方法
- 第三节:规划URL跳转
- 第四节:登录
- 4.4.1 登录流程
- 4.4.2 index action
- 4.4.3 login action
- 4.4.4 引入M层
- 4.4.5 异常Exception
- 第五节:注销
- 第六节:验证
- 4.6.1 action增加验证
- 4.6.2 使用构造函数验证
- 4.6.3 使用继承验证
- 第五章 E-R图与数据字典
- 第一节:第一张E-R图
- 第二节:实体间的关系
- 第三节:开发规范
- 第六章 班级管理
- 第一节:建立数据表
- 第二节:数据列表index
- 第三节:增加数据add
- 第四节:编辑数据edit
- 第五节:删除数据delete
- 第七章 学生管理
- 第一节:建立数据表
- 第二节:数据列表
- 7.2.1 显示性别
- 7.2.2 显示创建时间
- 7.2.3 显示班级名称
- 7.2.4 显示辅导员姓名
- 第三节:编辑数据
- 第四节:魔法函数
- 第五节:源码分析
- 第八章 课程管理
- 第一节:建立数据表
- 第二节:新增课程
- 第三节:编辑课程
- 8.3.1 edit
- 8.3.2 update
- 第九章 代码重构
- 第一节:add 与 edit
- 第二节:insert 与 update
- 第三节:模板继承
- 9.3.1 index.html
- 9.3.2 edit.html
- 9.3.3 小结
- 第十章 UML图
- 第一节:E-R图回顾
- 第二节:UML图
- 第十一章 菜单与路由
- 第一节:添加菜单
- 第二节:虚拟主机
- 第三节:定制路由
- 第十二章 开发调试
- 第一节:开启trace
- 第二节:查看日志
- 第十三章:总结