# 殊途同歸
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對應執行哪個方法中的語句的。如下圖所示:
比如我們進行如下訪問:

按照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自動調用的規則,我們用一個比較亂,但卻很能說明問題的圖來說明一下。

> 模塊: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**:按下圖所示創建文件,訪問該文件并輸出正確結果。

~~~
git checkout -f step2.5
~~~
執行上述命令后,本節示例代碼信息如下:
目標1實現代碼:

目標2實現代碼:

目標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
- 第二節:查看日志
- 第十三章:總結