殊途同歸
http://127.0.0.1/thinkphp5/public
http://127.0.0.1/thinkphp5/public/index.php
http://127.0.0.1/thinkphp5/public/index.php/index
http://127.0.0.1/thinkphp5/public/index.php/index/Index
http://127.0.0.1/thinkphp5/public/index.php/index/Index/index
上述五種不同的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弄明白。
當我們未指定模塊名時,調用的是默認模塊index。
當我們未指定控制器名時,調用的是默認控制器Index(注意,這個是Index,而不是index,原因是控制器實際上是一個類,我們規定類的名字首寫字母要大寫)。
當我們在URL中未指定觸發器名時,調用的是默認觸發器index。
程序員思維就是這樣,能用統一的 "index"變量(文件名等…)的時候,他們就懶得用其它變量……;
但其實 MCA這里面的概念好多啊? 一會兒模塊名、一會兒控制器名、一會兒觸發器名(函數名)……整這么多?!還都起名叫“index”……簡直讓初學者暈死去。
好吧,讓我來拯救初學者……咱們把所有的名字都區分開!
比如:
Module模塊名咱就叫: module1name1、module2name2、module3name3等……;
Controller控制器名咱就叫: controller2name2、controller4name4……等;
Action(觸發器)名咱就叫: action3functionName3, action6fuctionName6等等……
起名字嗎……咱就講究“誰也不影響誰”(俗稱:天上一手地下一腳、十三不靠)
再看一下,重命名以后的 Thinkphp(部署:目錄、文件、類、函數)架構吧:

MCA
是的,沒有什么深奧的道理。
M = Module 它對應一個文件夾(可以稱為:“模塊”)
C = Controller 它對應一個文件(可以稱為:控制器、或稱為“類名字”)
A = Action 它對應一個方法(它還有幾個名字:觸發器、函數、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不同、語句執行結果卻相同的情況。
其它代碼