這里記錄的是本人學習的thinkPHP筆記官方開發手冊
http://document.thinkphp.cn/manual_3_2.html
一、thinkPHP3.2目錄結構
工程目錄
www WEB部署目錄(或者子目錄)
├─index.php 入口文件
├─README.md README文件
├─Application 應用目錄
├─Public 資源文件目錄
└─ThinkPHP 框架目錄
TP框架結構
├─ThinkPHP 框架系統目錄(可以部署在非web目錄下面)
│ ├─Common 核心公共函數目錄
│ ├─Conf 核心配置目錄
│ ├─Lang 核心語言包目錄
│ ├─Library 框架類庫目錄
│ │ ├─Think 核心Think類庫包目錄
│ │ ├─Behavior 行為類庫目錄
│ │ ├─Org Org類庫包目錄
│ │ ├─Vendor 第三方類庫目錄
│ │ ├─ ... 更多類庫目錄
│ ├─Mode 框架應用模式目錄
│ ├─Tpl 系統模板目錄
│ ├─LICENSE.txt 框架授權協議文件
│ ├─logo.png 框架LOGO文件
│ ├─README.txt 框架README文件
│ └─ThinkPHP.php 框架入口文件
從3.2開始TP默認給我們提供了一個已經配置好的入口文件和一個應用程序目錄,應用程序目錄是空的,當你第一在瀏覽器中輸入"localhost/工程名稱/"的時候會在application目錄自動生成一個程序,目錄如下:
Application
├─Common 應用公共模塊
│ ├─Common 應用公共函數目錄
│ └─Conf 應用公共配置文件目錄
├─Home 默認生成的Home模塊
│ ├─Conf 模塊配置文件目錄
│ ├─Common 模塊函數公共目錄
│ ├─Controller 模塊控制器目錄
│ ├─Model 模塊模型目錄
│ └─View 模塊視圖文件目錄
├─Runtime 運行時目錄
│ ├─Cache 模版緩存目錄
│ ├─Data 數據目錄
│ ├─Logs 日志目錄
│ └─Temp 緩存目錄
二、TP命名規范
TP命名采用駝峰法命名,對于類名首字母要大寫,對于M類和C類要有Model后綴和Controller后綴。
- 對于控制器類:類名+Controller.class.php 并且繼承自extends Controller或者Controller的子類
- 對于模型類:類名+Model.class.php 并且繼承自extends Model或者Model的子類
- 對于視圖文件名:Home/View/模塊名(以對應控制器命名的文件夾)/視圖名(以對應控制器中要顯示該視圖函數的名稱命名)
注:對于視圖文件的命名方式可以隨意,但是在控制器中顯示該視圖的函數中display方法就要帶有參數了,參數的方式有多中
例如:對應控制器sunleiController.class.php 視圖的路徑為:/Home/View/long/add.html
控制其中有一個方法sun(),此方法中的display需要這樣寫$this->display(‘long:add’);,這種方式不是唯一的,也可以用其他形式的參數
在瀏覽器中輸入localhost/工程名/index.php/sunlei/sun 即可
三、解釋下其中的幾個概念:
名稱 | 描述 |
---|---|
應用 | 基于同一個入口文件訪問的項目我們稱之為一個應用。 |
模塊 | 一個應用下面可以包含多個模塊,每個模塊在應用目錄下面都是一個獨立的子目錄,包含配置文件,MVC文件等,3.2以后默認生成一個Home模塊。 |
控制器 | 每個模塊可以包含多個控制器,一個控制器通常體現為一個控制器類。 |
操作 | 每個控制器類可以包含多個操作方法,也可能是綁定的某個操作類,每個操作是URL訪問的最小單元。 |
模塊化設計的思想下面,模塊是最重要的部分,模塊其實是一個包含配置文件、函數文件和MVC文件(目錄)的集合。
四、URL模式
官方鏈接:http://document.thinkphp.cn/manual_3_2.html#url
如果我們直接訪問入口文件的話,由于URL中沒有模塊名、控制器名稱(不包括Controller后綴)和操作名稱(函數名稱),因此系統會訪問默認模塊(Home)下面的默認控制器(Index)的默認操作(index),因此下面的訪問是等效的:
http://serverName/index.php
http://serverName/index.php/Home/Index/index
http://serverName/index.php/?m=Home/Index&a=index
上面這種URL模式就是系統默認的PATHINFO模式,也是最常用的模式,不同的URL模式獲取模塊和操作的方法不同,ThinkPHP支持的URL模式有四種:普通模式、PATHINFO、REWRITE和兼容模式,可以設置URL_MODEL參數改變URL模式。
URL模式 | URL_MODEL設置 |
---|---|
普通模式 | 0 |
PATHINFO模式 | 1 |
REWRITE模式 | 2 |
兼容模式 | 3 |
如果你整個應用下面的模塊都是采用統一的URL模式,就可以在應用的配置文件中設置URL模式,如果不同的模塊需要設置不同的URL模式,則可以在模塊的配置文件中設置。
五、函數參數的綁定
參數綁定功能默認是開啟的,其原理是把URL中的參數(不包括模塊、控制器和操作名)和操作方法中的參數進行綁定。
要啟用參數綁定功能,首先確保你開啟了URL_PARAMS_BIND設置:
'URL_PARAMS_BIND' => true, // URL變量綁定到操作方法作為參數
參數綁定有兩種方式:按照變量名綁定(默認)和按照變量順序綁定。
注意:對于帶有參數的函數,如果URL沒有傳入對應的參數值,則會報錯,為避免報錯我們可以給函數設置一個默認值
如:
public function read($id=0){
echo 'id='.$id;
}
六、偽靜態
URL偽靜態通常是為了滿足更好的SEO效果,ThinkPHP支持偽靜態URL設置,可以通過設置URL_HTML_SUFFIX參數隨意在URL的最后增加你想要的靜態后綴,而不會影響當前操作的正常執行。例如,我們設置
'URL_HTML_SUFFIX'=>'shtml'
的話,我們可以把下面的URL http://serverName/Home/Blog/read/id/1 變成 http://serverName/Home/Blog/read/id/1.shtml
后者更具有靜態頁面的URL特征,但是具有和前面的URL相同的執行效果,并且不會影響原來參數的使用。
默認情況下,偽靜態的設置為html,如果我們設置偽靜態后綴為空,
'URL_HTML_SUFFIX'=>''
則可以支持所有的靜態后綴,并且會記錄當前的偽靜態后綴到常量 EXT ,但不會影響正常的頁面訪問。
例如:
http://serverName/Home/blog/3.html
http://serverName/Home/blog/3.shtml
http://serverName/Home/blog/3.xml
http://serverName/Home/blog/3.pdf
都可以正常訪問,如果要獲取當前的偽靜態后綴,通過常量 EXT 獲取即可。
如果希望支持多個偽靜態后綴,可以直接設置如下:
// 多個偽靜態后綴設置 用|分割
'URL_HTML_SUFFIX' => 'html|shtml|xml'
那么,當訪問 http://serverName/Home/blog/3.pdf 的時候會報系統錯誤。
可以設置禁止訪問的URL后綴,例如:
'URL_DENY_SUFFIX' => 'pdf|ico|png|gif|jpg', // URL禁止訪問的后綴設置
如果訪問 http://serverName/Home/blog/3.pdf 就會直接返回404錯誤。
注意:
URL_DENY_SUFFIX的優先級比URL_HTML_SUFFIX要高。
七、URL的大小寫問題
對于Windows來說URL是不區分大小寫的,但是在Linux下是區分大小寫的,但是TP框架給了我們配置的權利,我們可以通過配置
'URL_CASE_INSENSITIVE' =>true
來達到在任何平臺下都不區分大小寫
這里需要注意一個地方,一旦開啟了不區分URL大小寫后,如果我們要訪問類似UserTypeController的控制器,那么正確的URL訪問應該是:
// 正確的訪問地址
http://serverName/index.php/home/user_type/index
// 錯誤的訪問地址(linux環境下)
http://serverName/index.php/home/usertype/index
利用系統提供的U方法可以為你自動生成相關的URL地址。
如果設置
'URL_CASE_INSENSITIVE' =>false
的話,URL就又變成: http://serverName/index.php/Home/UserType/add
注意:URL不區分大小寫并不會改變系統的命名規范,并且只有按照系統的命名規范后才能正確的實現URL不區分大小寫。
建議還是習慣性的區分大小寫吧,系統默認的規范是根據URL里面的模塊名、控制器名來定位到具體的控制器類的,從而執行控制器類的操作方法。
在MVC三層中,ThinkPHP并不依賴M或者V,甚至可以只有C或者只有V,這個在ThinkPHP的設計里面是一個很重要的用戶體驗設計,用戶只需要定義視圖,在沒有C的情況下也能自動識別。
八、庫文件自動加載的順序(優先級)
在實際的應用類庫加載過程中,往往會涉及到自動加載的優先級問題,以Test\MyClass類為例,自動加載的優先順序如下:
1.判斷是否有注冊了Test\MyClass類庫映射,如果有則自動加載類庫映射定義的文件;
2.判斷是否存在Library/Test目錄,有則以該目錄為初始目錄加載;
3.判斷是否有注冊Test根命名空間,有則以注冊的目錄為初始目錄加載;
4.如果以上都不成立,則以Test為模塊目錄進行初始目錄加載;
5.然后以上面獲取到的初始目錄加載命名空間對應路徑的文件;
九、TP常用函數
- U函數
用于獲取URL的:U()
U('/Admin/Insert/insert@localhost’)
- C函數
之前的方式都是通過預先定義配置文件的方式,而在具體的操作方法里面,我們仍然可以對某些參數進行動態配置(或者增加新的配置),主要是指那些還沒有被使用的參數。
設置新的值:
C('參數名稱','新的參數值')
動態配置賦值僅對當前請求有效,不會對以后的請求造成影響。
獲取已設置的配置參數的值:
$config = C('參數名稱');
- A函數
默認情況下,A方法實例化的是默認控制器層(Controller)
如果控制器有分層控制器,要實例化分層控制器的話,則寫二級模塊名,否則第二個參數可以忽略
A('模塊名/控制器名','二級模塊名')
訪問控制器(默認是Home,可以設置)的實例化通常是自動完成的,系統會根據URL地址解析出訪問的控制器名稱自動實例化,并且調用相關的操作方法。
如果你需要跨控制器調用的話,則可以單獨實例化:
// 實例化Home模塊的User控制器
$User = new \Home\Controller\UserController();
// 實例化Admin模塊的Blog控制器
$Blog = new \Admin\Controller\BlogController();
系統為上面的控制器實例化提供了一個快捷調用方法A,上面的代碼可以簡化為:
// 假設當前模塊是Home模塊
$User = A('User');
$Blog = A('Admin/Blog');
默認情況下,A方法實例化的是默認控制器層(Controller),如果你要實例化其他的分層控制器的話,可以使用:
// 假設當前模塊是Home模塊
// 實例化Event控制器
$User = A('User','Event');
$Blog = A('Admin/Blog','Event');
上面的代碼等效于:
// 實例化Home模塊的User事件控制器
$User = new \Home\Event\UserEvent();
// 實例化Admin模塊的Blog事件控制器
$Blog = new \Admin\Event\BlogEvent();