1. 緩存
修改模版時要注意及時刪除緩存,否則不能立即生效。
2.命名規范
類文件以.class.php為后綴,駝峰法命名,并且首字母大寫,例如DbMysql.class.php。
函數、配置文件等其他類庫文件之外的一般是以.php為后綴(第三方引入的不做要求)。
類名和文件名一致,例如 UserAction類的文件命名是UserAction.class.php, InfoModel類的文件名是InfoModel.class.php,
函數的命名使用小寫字母和下劃線的方式,例如 get_client_ip
Action控制器類以Action為后綴,例如 UserAction、InfoAction
模型類以Model為后綴,例如UserModel、InfoModel
方法的命名使用駝峰法,并且首字母小寫,例如 getUserName
屬性的命名使用駝峰法,并且首字母小寫,例如 tableName
以雙下劃線“__”打頭的函數或方法作為魔法方法,例如 __call 和 __autoload
常量以大寫字母和下劃線命名,例如 HAS_ONE和 MANY_TO_MANY
配置參數以大寫字母和下劃線命名,例如HTML_CACHE_ON
語言變量以大寫字母和下劃線命名,例如MY_LANG,以下劃線打頭的語言變量通常用于系統語言變量,例如 _CLASS_NOT_EXIST_。
數據表和字段采用小寫加下劃線方式命名,例如 think_user 和 user_name
特例:在ThinkPHP里面,單字母大寫函數,通常是某些操作的快捷定義,或者有特殊的作用。例如,ADSL方法等等
3.配置
ThinkPHP提供了靈活的全局配置功能,采用最有效率的PHP返回數組方式定義,支持慣例配置、項目配置、調試配置和模塊配置
慣例配置:系統內置有一個慣例配置文件(位于ThinkCommonconvention.php),按照大多數的使用對常用參數進行了默認配置。
項目配置:項目配置文件位于項目的配置文件目錄(默認是Conf)下面,文件名是config.php。
調試配置:如果啟用了調試模式的話,那么會導入框架默認的調試配置文件,默認的調試配置文件位于ThinkCommondebug.php。自定義項目配置文件位于conf/debug.php
分組配置:分組配置用于系統啟用了分組模式的情況之下,對于每個分組可以單獨定義自己的配置文件。分組配置文件位于:項目配置目錄/分組名稱/config.php
模塊配置:
ThinkPHP支持對某些參數進行動態配置,針對這一特性,ThinkPHP還特別引入了模塊配置文件的支持,這其實也是動態配置的體現。
模塊配置文件位于:
項目配置目錄/模塊名(小寫)_config.php // 用于不使用分組的情況
或者
項目配置目錄/分組名/模塊名(小寫)_config.php // 用于使用分組的情況
讀取配置:定義了配置文件之后,可以使用系統提供的C方法來讀取已有的配置:
C('參數名稱') // 獲取已經設置的參數值
動態配置:在具體的Action方法里面,我們仍然可以對某些參數進行動態配置,主要是指那些還沒有被使用的參數。
C('參數名稱','新的參數值');
擴展配置:慣例配置如下 'APP_CONFIG_LIST' => array('taglibs','routes','htmls','modules','actions','tags'),
4.模塊和操作
4.1基礎
每個模塊是一個Action文件,類似于我們平常所說的控制器,系統會自動尋找項目類庫Action目錄下面的相關類,如果沒有找到,則會定位到空模塊,否則拋出異常。
而actionName操作是首先判斷是否存在Action類的公共方法,如果不存在則會繼續尋找父類中的方法,如果依然不存在,就會尋找是否存在自動匹配的模版文件。如果存在模版文件,那么就直接渲染模版輸出。
因此應用開發中的一個重要過程就是給不同的模塊定義具體的操作。一個應用如果不需要和數據庫交互的時候可以不需要定義模型類,但是必須定義Action控制器。
4.2 默認模塊
系統的默認模塊設置是Index模塊,默認操作設置是index操作
4.3 模塊分組
模塊分組功能是為了更好的組織已有的模塊,并且增加項目容量的一個有效機制。分組功能可以把以往的多項目合并到一個項目中去,這樣一來,之前需要采用跨項目 操作的地方,現在因為在一個項目中從而免去了不少麻煩,并且公共文件的重用也方便了,并且每個分組都可以有自己獨立的配置文件、公共文件、語言包,在 URL的訪問上面也非常清晰。
要啟用分組模塊非常簡單,配置下APP_GROUP_LIST參數和DEFAULT_GROUP參數即可。
例如我們把當前的項目分成Home和Admin兩個組,分別表示前臺和后臺功能
'APP_GROUP_LIST'=>'Admin,Home',
'DEFAULT_GROUP'=>'Home',
4.3 URL模式
ThinkPHP支持四種URL模式,可以通過設置URL_MODEL參數來定義,包括普通模式、PATHINFO、REWRITE和兼容模式。
URL_MODEL 為0,采用傳統的URL參數模式,http://<serverName>/appName/?m=module&a=action&id=1
URL_MODEL 為1,默認情況使用PATHINFO模式,ThinkPHP內置強大的PATHINFO支持,提供靈活和友好URL支持。PATHINFO模式根據不同的設置還包括普通模式和智能模式兩種:
普通模式 設置URL_PATHINFO_MODEL 參數為1 ,該模式下面URL參數沒有順序,例如
http://<serverName>/appName/m/module/a/action/id/1
http://<serverName>/appName/a/action/id/1/m/module
以上URL等效
智能模式 設置URL_PATHINFO_MODEL 參數為2 (系統默認的模式),自動識別模塊和操作,例如
URL_MODEL 為2,REWRITE模式,該URL模式和PATHINFO模式功能一樣,除了可以不需要在URL里面寫入口文件,和可以定義.htaccess 文件外。在開啟了Apache的URL_REWRITE模塊后,就可以啟用REWRITE模式了,具體參考下面的URL重寫部分。
URL_MODEL 為3,兼容模式,兼容模式是普通模式和PATHINFO模式的結合,并且可以讓應用在需要的時候直接切換到PATHINFO模式而不需要更改模板和程序。兼容模式URL可以支持任何的運行環境。
4.4 URL路由
4.5 URL偽靜態
系統支持偽靜態URL設置,可以通過設置URL_HTML_SUFFIX參數隨意在URL的最后增加你想要的靜態后綴,而不會影響當前操作的正常執行。例如,我們設置URL_HTML_SUFFIX 為 .shtml 的話,我們可以把下面的URL
http:///Blog/read/id/1
變成
http:///Blog/read/id/1.shtml
4.6 URL重寫
通常的URL里面含有index.php,為了達到更好的SEO效果可能需要去掉URL里面的index.php ,通過URL重寫的方式可以達到這種效果,通常需要服務器開啟URL_REWRITE模塊才能支持。
下面是Apache的配置過程,可以參考下:
1、httpd.conf配置文件中加載了mod_rewrite.so模塊
2、AllowOverride None 將None改為 All
3、確保URL_MODEL設置為2
4、把.htaccess文件放到入口文件的同級目錄下
- RewriteEngine on
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
4.7 URL生成
為了配合所使用的URL模式,我們需要能夠動態的根據當前的URL設置生成對應的URL地址,為此,ThinkPHP內置提供了U方法,用于URL的動態生成,可以確保項目在移植過程中不受環境的影響。
4.8 URL大小寫
系統本身已經提供了一個很好的解決方案,可以通過配置簡單實現。只要在項目配置中,增加:
'URL_CASE_INSENSITIVE' => true
就可以實現URL訪問不再區分大小寫了。
4.9 空操作
空操作是指系統在找不到指定的操作方法的時候,會定位到空操作(_empty)方法來執行,利用這個機制,我們可以實現錯誤頁面和一些URL的優化。
- Class CityAction extends Action{
- Public function _empty(){
- ...
- }
- }
4.10 空模塊
空模塊的概念是指當系統找不到指定的模塊名稱的時候,系統會嘗試定位空模塊(EmptyAction),利用這個機制我們可以用來定制錯誤頁面和進行URL的優化。
Class EmptyAction extends Action{
4.11 前置和后置操作
前置和后置操作
系統會檢測當前操作是否具有前置和后置操作,如果存在就會按照順序執行,例如,我們在UserAction類里面定義了_before_insert() 和 _after_insert() 操作,那么執行User模塊的insert操作的時候,會按照順序執行下面的操作:
- _before_insert
- insert
- _after_insert
4.12操作鏈
ThinkPHP支持使用操作鏈的方式,例如,我們訪問下面的URL:http://serverName/appName/User/action1:action2:action3/
那么會依次執行UserAction的action1 action2 action3方法,并且當前操作名稱是最后一個操作。在進行默認模板輸出的時候會用到。如果確實需要在不同的操作方法中都進行輸出,請確保在 Action的display方法中指定需要渲染的模板文件名。否則,只能輸出最后的操作模板。使用了操作鏈后,前置和后置方法會失效。
4.13 跨模塊調用
在開發過程中經常會在當前模塊調用其他模塊的方法,這個時候就涉及到跨模塊調用,我們還可以了解到A和R兩個快捷方法的使用。
$User = A("User"); // 實例化UserAction控制器對象
$User->importUser(); // 調用User模塊的importUser操作方法
這里的A("User") 是一個快捷方法,和下面的代碼等效:
- import("@.Action.UserAction");
- $User = new UserAction();
事實上,在這個例子里面還有比A方法更簡單的調用方法,例如:
R("User","importUser"); // 遠程調用UserAction控制器的importUser操作方法
上面只是在當前項目中調用,如果你有需要在多個項目之間調用方法,一樣可以完成:
- $User = A("User","App2"); // 實例化App2項目的UserAction控制器對象
- $User->importUser();
- // 遠程調用App2項目的UserAction控制器的importUser操作方法
- R("User","importUser","App2");
4.14 頁面跳轉
在應用開發中,經常會遇到一些帶有提示信息的跳轉頁面,例如操作成功或者操作錯誤頁面,并且自動跳轉到另外一個目標頁面,系統的Action類內置了兩個跳轉方法success和error,用于頁面跳轉提示,而且可以支持ajax提交,使用方法很簡單,舉例如下:
- $User = M("User"); // 實例化User對象
- $result = $User->add($data);
- if ($result){
- // 設置成功后的跳轉頁面地址 默認的返回頁面是$_SERVER["HTTP_REFERER"]
- $this->assign("jumpUrl","/User/list/");
- $this->success("新增成功!");
- }else{
- // 錯誤頁面的默認跳轉頁面是返回上一頁 通常可以不用設置
- $this->error("新增錯誤!");
- }
Success和error方法都有對應的模板,并且是可以設置的,默認的設置Public:success和Public:error,模板文件可以使用模板標簽,并且可以使用下面的模板變量:
$msgTitle :操作標題
$message :頁面提示信息
$status :操作狀態 1表示成功 0 表示失敗 具體還可以由項目本身定義規則
$waitSecond :跳轉等待時間 單位為妙
$jumpUrl :跳轉頁面地址
如果是AJAX方式提交的話,success和error方法會調用ajaxReturn方法返回信息,具體可以參考后面的AJAX返回部分。
4.15 重定向
Action類的redirect方法可以實現頁面的重定向功能。
redirect方法的參數用法和U函數的用法一致(參考上面的URL生成部分),例如:
$this->redirect('User/list', array('cate_id'=>2), 5,'頁面跳轉中~')
上面的用法是停留5秒后跳轉到User模塊的list操作,并且顯示頁面跳轉中字樣,重定向后會改變當前的URL地址。
4.16 AJAX返回
系統支持任何的AJAX類庫,提供了ajaxReturn方法用于AJAX調用后返回數據給客戶端。
并且支持JSON、XML和EVAL三種方式給客戶端接受數據,通過配置DEFAULT_AJAX_RETURN進行設置,在選擇不同的AJAX類庫的時候可以使用不同的方式返回數據。
要使用ThinkPHP的ajaxReturn方法返回數據的話,需要遵守一定的返回數據的格式規范。ThinkPHP返回的數據格式包括:
status 操作狀態
info 提示信息
data 返回數據
返回數據data可以支持字符串、數字和數組、對象,返回客戶端的時候根據不同的返回格式進行編碼后傳輸。如果是JSON格式,會自動編碼成JSON字符 串,如果是XML方式,會自動編碼成XML字符串,如果是EVAL方式的話,只會輸出字符串data數據,并且忽略status和info信息。
下面是一個簡單的例子:
- $User = M("User"); // 實例化User對象
- $result = $User->add($data);
- if ($result){
- // 成功后返回客戶端新增的用戶ID,并返回提示信息和操作狀態
- $this->ajaxReturn($result,"新增成功!",1);
- }else{
- // 錯誤后返回錯誤的操作狀態和提示信息
- $this->ajaxReturn(0,"新增錯誤!",0);
- }
注意,確保你是使用AJAX提交才使用ajaxReturn方法。
在客戶端接受數據的時候,根據使用的編碼格式進行解析即可。
新聞熱點
疑難解答
圖片精選