簡介
ThinkPHP是一個快速、簡單的基於MVC和麵向物件的輕量級PHP開發框架,遵循Apache2開源協議釋出,從誕生以來一直秉承簡潔實用的設計原則,在保持出色的效能和至簡的程式碼的同時,尤其注重開發體驗和易用性,並且擁有眾多的原創功能和特性,為WEB應用開發提供了強有力的支援。
目錄結構
ThinkPHP最新版本可以在官方網站(http://thinkphp.cn/down/framework.html)或者Github(https://github.com/liu21st/thinkphp/downloads)下載。
把下載後的壓縮檔案解壓到你的WEB目錄(或者任何目錄都可以),框架的目錄結構為:
3.2版本相比之前的版本自帶了一個完整的應用目錄結構(Application)和預設的應用入口檔案(index.php),開發人員可以在這個基礎之上靈活調整(目錄名稱和位置)。其中,Application和Public目錄下面都是空的,而README.md檔案僅用於說明,實際部署的時候可以刪除。
其中,ThinkPHP為框架核心目錄,其目錄結構如下:
入口檔案
在開始之前,你需要一個Web伺服器和PHP執行環境,如果你暫時還沒有,我們推薦使用整合開發環境WAMPServer(是一個整合了Apache、PHP和MySQL的開發套件,而且支援多個PHP版本、MySQL版本和Apache版本的切換)來使用ThinkPHP進行本地開發和測試。
3.2版本開始框架自帶了一個應用入口檔案,預設內容如下:
這段程式碼的作用就是定義應用目錄和載入ThinkPHP框架的入口檔案,這是所有基於ThinkPHP開發應用的第一步。
然後,在瀏覽器中訪問執行後我們會看到歡迎頁面,
這個頁面比3.1版本多了一個當前訪問的控制器提示,因為3.2版本支援多模組自動生成,暫且不表。
當你看到這個歡迎頁面的時候,系統已經在Application下面自動生成了公共模組Common、預設的Home模組和Runtime執行時目錄的目錄結構:
3.2版本採用模組化的設計架構,下面是一個典型的模組目錄結構,每個模組可以方便的解除安裝和部署,並且支援公共模組(Runtime目錄非模組目錄)。
如何生成其他模組的目錄結構呢?只需要在入口檔案中新增如下定義:
在Application下面已經自動生成了Admin模組及其目錄機構。
注意:生成以後,你需要刪除剛才那段常量定義才能正常訪問Home模組。
有些情況下,我們需要更改應用目錄、執行時目錄和框架的位置,那麼可以修改入口檔案如下:
除錯模式
ThinkPHP支援除錯模式,預設情況下是執行在部署模式下面。部署模式下面效能優先,並且儘可能少地丟擲錯誤資訊,除錯模式則以除錯方便優先,關閉任何快取,而且儘可能多的丟擲錯誤資訊,所以對效能有一定的影響。部署模式採用了專案編譯機制,第一次執行會對核心和專案相關檔案進行編譯快取,由於編譯後會影響開發過程中對配置檔案、函式檔案和資料庫修改的生效(除非你修改後手動清空Runtime下面的快取檔案)。因此為了避免以上問題,我們強烈建議新手在使用ThinkPHP開發的過程中使用除錯模式,這樣可以更好的獲取錯誤提示和避免一些不必要的問題和煩惱。
開啟除錯模式很簡單,我們只需要在入口檔案的開頭加上一行常量定義程式碼:
配置
每個應用模組都有獨立的配置檔案(位於模組目錄的Conf/config.php),配置檔案的定義格式支援PHP/JSON/YAML/INI/XML等方式,預設採用PHP陣列定義,例如:
一旦有需要,我們就可以在配置檔案中新增相關配置專案。通常我們提到的新增配置專案,就是指在專案配置檔案中新增:
配置值可以支援包括字串、數字、布林值和陣列在內的資料,通常我們建議配置引數均使用大寫定義。如果有需要,我們還可以為專案定義其他的配置檔案。
如果要使用其他格式的配置檔案,可以在入口檔案中定義CONF_EXT常量即可,例如:
控制器
需要為每個模組定義一個控制器類,控制器類的命名規範是:
模組名+Controller.class.php (模組名採用駝峰法並且首字母大寫)
系統的預設模組是Index,對應的控制器就是模組目錄下面的Controller/IndexController.class.php,類名和檔名一致。預設操作是index,也就是控制器的一個public方法。初次生成專案目錄結構的時候,系統已經預設生成了一個預設控制器(就是之前看到的歡迎頁面),我們把index方法改成下面的程式碼:
再次訪問入口檔案的時候,在瀏覽器中看到預設的歡迎頁面已經改成如下輸出:
一個模組可以包括多個操作方法,但如果你的操作方法是protected或者private型別的話,是無法直接通過URL訪問到該操作的。
URL請求
ThinkPHP採用單一入口模式訪問應用,對應用的所有請求都定向到應用的入口檔案,系統會從URL引數中解析當前請求的模組、控制器和操作,下面是一個標準的URL訪問格式:
如果我們直接訪問入口檔案的話,由於URL中沒有模組、控制器和操作,因此係統會訪問預設模組(Home)下面的預設控制器(Index)的預設操作(index),因此下面的訪問是等效的:
普通模式:也就是傳統的GET傳參方式來指定當前訪問的模組和操作,例如:
m參數列示模組,c表示控制器,a表示操作(當然,這些引數名是可以配置的),後面的表示其他GET引數。
PATHINFO模式:是系統的預設URL模式,提供了最好的SEO支援,系統內部已經做了環境的相容處理,所以能夠支援大多數的主機環境。對應上面的URL模式,PATHINFO模式下面的URL訪問地址是:
PATHINFO地址的前三個引數分別表示模組/控制器/操作。PATHINFO模式下面,URL是可定製的,例如,通過下面的配置:
我們可以支援下面的URL訪問:
REWRITE模式:是在PATHINFO模式的基礎上新增了重寫規則的支援,可以去掉URL地址裡面的入口檔案index.php,但是需要額外配置WEB伺服器的重寫規則。
如果是Apache則需要在入口檔案的同級新增.htaccess檔案,內容如下:
接下來就可以使用下面的URL地址訪問了
相容模式:是用於不支援PATHINFO的特殊環境,URL地址是:
相容模式配合Web伺服器重寫規則的定義,可以達到和REWRITE模式一樣的URL效果。
檢視
ThinkPHP內建了一個編譯型模板引擎,也支援原生的PHP模板,並且還提供了包括Smarty在內的模板引擎驅動。和Smarty不同,ThinkPHP在渲染模板的時候如果不指定模板,則會採用系統預設的定位規則,其定義規範預設是模組目錄下面的 View/控制器名/操作名.html,所以,Index模組的index操作的預設模板檔案位於Home模組目錄下面的View/Index/index.html,我們新增模板內容如下:
要輸出檢視,必須在控制器方法中進行模板渲染輸出操作,例如:
display方法中我們沒有指定任何模板,所以按照系統預設的規則輸出了Index/index.html模板檔案。
接下來,我們在瀏覽器訪問輸出:
hello,thinkphp!
讀取資料
在開始之前,我們首先在資料庫thinkphp中建立一個think_data資料表(以mysql資料庫為例):
如果我們需要讀取資料庫中的資料,就需要在模組配置檔案中新增資料庫連線資訊如下:
或者採用如下配置
使用DB_DSN方式定義可以簡化配置引數,DSN引數格式為:
資料庫型別://使用者名稱:密碼@資料庫地址:資料庫埠/資料庫名
如果兩種配置引數同時存在的話,DB_DSN配置引數優先。
接下來,我們修改下控制器方法,新增讀取資料的程式碼:
這裡用到了M函式,是ThinkPHP內建的例項化模型的方法,而且用M方法例項化模型不需要建立對應的模型類,你可以理解為M方法是直接在操作底層的Model類,而Model類具備基本的CURD操作方法。
M('Data') 例項化後,就可以對think_data資料表(think_ 是我們在專案配置檔案中定義的資料表字首)進行操作(包括CURD)了,M函式的用法還有很多,我們以後會深入瞭解。
定義好控制器後,我們修改模板檔案,新增資料輸出標籤如下:
我們訪問會輸出:
如果發生錯誤,檢查你是否開啟了除錯模式或者清空Runtime目錄下面的快取檔案。
如果你看到了上面的輸出結果,那麼恭喜你已經拿到了入門ThinkPHP的鑰匙!
總結
本篇我們學習了ThinkPHP的目錄結構、URL模式,如何建立專案的入口檔案和開啟除錯模式,以及控制器、模板和模型的基礎認識,後面會繼續瞭解對資料的CURD操作。
ThinkPHP是一個快速、簡單的基於MVC和麵向物件的輕量級PHP開發框架,遵循Apache2開源協議釋出,從誕生以來一直秉承簡潔實用的設計原則,在保持出色的效能和至簡的程式碼的同時,尤其注重開發體驗和易用性,並且擁有眾多的原創功能和特性,為WEB應用開發提供了強有力的支援。
目錄結構
ThinkPHP最新版本可以在官方網站(http://thinkphp.cn/down/framework.html)或者Github(https://github.com/liu21st/thinkphp/downloads)下載。
把下載後的壓縮檔案解壓到你的WEB目錄(或者任何目錄都可以),框架的目錄結構為:
www WEB部署目錄(或者子目錄) ├─index.php 入口檔案 ├─README.md README檔案 ├─Application 應用目錄 ├─Public 資原始檔目錄 └─ThinkPHP 框架目錄
3.2版本相比之前的版本自帶了一個完整的應用目錄結構(Application)和預設的應用入口檔案(index.php),開發人員可以在這個基礎之上靈活調整(目錄名稱和位置)。其中,Application和Public目錄下面都是空的,而README.md檔案僅用於說明,實際部署的時候可以刪除。
其中,ThinkPHP為框架核心目錄,其目錄結構如下:
├─ThinkPHP 框架系統目錄(可以部署在非web目錄下面) │ ├─Common 核心公共函式目錄 │ ├─Conf 核心配置目錄 │ ├─Lang 核心語言包目錄 │ ├─Library 框架類庫目錄 │ │ ├─Think 核心Think類庫包目錄 │ │ ├─Behavior 行為類庫目錄 │ │ ├─Org Org類庫包目錄 │ │ ├─Vendor 第三方類庫目錄 │ │ ├─ ... 更多類庫目錄 │ ├─Mode 框架應用模式目錄 │ ├─Tpl 系統模板目錄 │ ├─LICENSE.txt 框架授權協議檔案 │ ├─logo.png 框架LOGO檔案 │ ├─README.txt 框架README檔案 │ └─index.php 框架入口檔案
入口檔案
在開始之前,你需要一個Web伺服器和PHP執行環境,如果你暫時還沒有,我們推薦使用整合開發環境WAMPServer(是一個整合了Apache、PHP和MySQL的開發套件,而且支援多個PHP版本、MySQL版本和Apache版本的切換)來使用ThinkPHP進行本地開發和測試。
3.2版本開始框架自帶了一個應用入口檔案,預設內容如下:
define('APP_PATH','./Application/'); require './ThinkPHP/ThinkPHP.php';
這段程式碼的作用就是定義應用目錄和載入ThinkPHP框架的入口檔案,這是所有基於ThinkPHP開發應用的第一步。
然後,在瀏覽器中訪問執行後我們會看到歡迎頁面,
這個頁面比3.1版本多了一個當前訪問的控制器提示,因為3.2版本支援多模組自動生成,暫且不表。
當你看到這個歡迎頁面的時候,系統已經在Application下面自動生成了公共模組Common、預設的Home模組和Runtime執行時目錄的目錄結構:
Application ├─Common 應用公共模組 │ ├─Common 應用公共函式目錄 │ └─Conf 應用公共配置檔案目錄 ├─Home 預設生成的Home模組 │ ├─Conf 模組配置檔案目錄 │ ├─Common 模組函式公共目錄 │ ├─Controller 模組控制器目錄 │ ├─Model 模組模型目錄 │ └─View 模組檢視檔案目錄 ├─Runtime 執行時目錄 │ ├─Cache 模版快取目錄 │ ├─Data 資料目錄 │ ├─Logs 日誌目錄 │ └─Temp 快取目錄模組設計
3.2版本採用模組化的設計架構,下面是一個典型的模組目錄結構,每個模組可以方便的解除安裝和部署,並且支援公共模組(Runtime目錄非模組目錄)。
Application 預設應用目錄(可以設定) ├─Common 公共模組(不能直接訪問) ├─Home 前臺模組 ├─Admin 後臺模組 ├─... 其他更多模組 ├─Runtime 預設執行時目錄(可以設定)每個模組是相對獨立的,其目錄結構如下:
├─Module 模組目錄 │ ├─Conf 配置檔案目錄 │ ├─Common 公共函式目錄 │ ├─Controller 控制器目錄 │ ├─Model 模型目錄 │ ├─Logic 邏輯目錄(可選) │ ├─Service Service目錄(可選) │ ... 更多分層目錄可選 │ └─View 檢視目錄由於採用多層的MVC機制,除了Conf和Common目錄外,每個模組下面的目錄結構可以根據需要靈活設定和新增,所以並不拘泥於上面展現的目錄。
如何生成其他模組的目錄結構呢?只需要在入口檔案中新增如下定義:
define('APP_PATH','./Application/'); // 繫結入口檔案到Admin模組訪問 define('BIND_MODULE','Admin'); require './ThinkPHP/ThinkPHP.php';BIND_MODULE常量定義表示繫結入口檔案到某個模組,由於並不存在Admin模組,所以會在第一次訪問的時候自動生成。重新訪問入口檔案後,就會看到Admin模組的歡迎頁面:
在Application下面已經自動生成了Admin模組及其目錄機構。
注意:生成以後,你需要刪除剛才那段常量定義才能正常訪問Home模組。
有些情況下,我們需要更改應用目錄、執行時目錄和框架的位置,那麼可以修改入口檔案如下:
// 定義應用目錄 define('APP_PATH','./Apps/'); // 定義執行時目錄 define('RUNTIME_PATH','./Runtime/'); // 更名框架目錄名稱,並載入框架入口檔案 require './Think/ThinkPHP.php';這樣最終的應用目錄結構如下:
www WEB部署目錄(或者子目錄) ├─index.php 應用入口檔案 ├─Apps 應用目錄 ├─Public 資原始檔目錄 ├─Runtime 執行時目錄 └─Think 框架目錄
除錯模式
ThinkPHP支援除錯模式,預設情況下是執行在部署模式下面。部署模式下面效能優先,並且儘可能少地丟擲錯誤資訊,除錯模式則以除錯方便優先,關閉任何快取,而且儘可能多的丟擲錯誤資訊,所以對效能有一定的影響。部署模式採用了專案編譯機制,第一次執行會對核心和專案相關檔案進行編譯快取,由於編譯後會影響開發過程中對配置檔案、函式檔案和資料庫修改的生效(除非你修改後手動清空Runtime下面的快取檔案)。因此為了避免以上問題,我們強烈建議新手在使用ThinkPHP開發的過程中使用除錯模式,這樣可以更好的獲取錯誤提示和避免一些不必要的問題和煩惱。
開啟除錯模式很簡單,我們只需要在入口檔案的開頭加上一行常量定義程式碼:
define('APP_PATH','./Application/'); define('APP_DEBUG', true); // 開啟除錯模式 require './ThinkPHP/ThinkPHP.php';開發完成後,我們實際進行專案部署的時候,刪除這行常量定義程式碼即可,或者改成:
define('APP_PATH','./Application/'); define('APP_DEBUG',false); // 關閉除錯模式 require './ThinkPHP/ThinkPHP.php';
配置
每個應用模組都有獨立的配置檔案(位於模組目錄的Conf/config.php),配置檔案的定義格式支援PHP/JSON/YAML/INI/XML等方式,預設採用PHP陣列定義,例如:
// 配置檔案 return array( '配置引數' => '配置值', // 更多配置引數 //... );如果你需要為各個模組定義公共的配置檔案,可以在公共模組中定義 Conf/config.php,定義格式是一樣。
一旦有需要,我們就可以在配置檔案中新增相關配置專案。通常我們提到的新增配置專案,就是指在專案配置檔案中新增:
'配置引數'=>'配置值',
配置值可以支援包括字串、數字、布林值和陣列在內的資料,通常我們建議配置引數均使用大寫定義。如果有需要,我們還可以為專案定義其他的配置檔案。
如果要使用其他格式的配置檔案,可以在入口檔案中定義CONF_EXT常量即可,例如:
define('CONF_EXT','.ini');這樣,模組的配置檔案就變成了 Conf/config.ini,定義如下:
DEFAULT_MODULE = Index ;預設模組 URL_MODEL = 2 ;URL模式更多的配置定義請參考後續的內容。
控制器
需要為每個模組定義一個控制器類,控制器類的命名規範是:
模組名+Controller.class.php (模組名採用駝峰法並且首字母大寫)
系統的預設模組是Index,對應的控制器就是模組目錄下面的Controller/IndexController.class.php,類名和檔名一致。預設操作是index,也就是控制器的一個public方法。初次生成專案目錄結構的時候,系統已經預設生成了一個預設控制器(就是之前看到的歡迎頁面),我們把index方法改成下面的程式碼:
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function hello(){ echo 'hello,thinkphp!'; } }
再次訪問入口檔案的時候,在瀏覽器中看到預設的歡迎頁面已經改成如下輸出:
hello,thinkphp!
一個模組可以包括多個操作方法,但如果你的操作方法是protected或者private型別的話,是無法直接通過URL訪問到該操作的。
URL請求
ThinkPHP採用單一入口模式訪問應用,對應用的所有請求都定向到應用的入口檔案,系統會從URL引數中解析當前請求的模組、控制器和操作,下面是一個標準的URL訪問格式:
http://serverName/index.php/模組/控制器/操作
如果我們直接訪問入口檔案的話,由於URL中沒有模組、控制器和操作,因此係統會訪問預設模組(Home)下面的預設控制器(Index)的預設操作(index),因此下面的訪問是等效的:
http://serverName/index.php http://serverName/index.php/Home/Index/index這種URL模式就是系統預設的PATHINFO模式,不同的URL模式獲取模組和操作的方法不同,ThinkPHP支援的URL模式有四種:普通模式、PATHINFO、REWRITE和相容模式。
普通模式:也就是傳統的GET傳參方式來指定當前訪問的模組和操作,例如:
http://localhost/?m=home&c=user&a=login&var=value
m參數列示模組,c表示控制器,a表示操作(當然,這些引數名是可以配置的),後面的表示其他GET引數。
PATHINFO模式:是系統的預設URL模式,提供了最好的SEO支援,系統內部已經做了環境的相容處理,所以能夠支援大多數的主機環境。對應上面的URL模式,PATHINFO模式下面的URL訪問地址是:
http://localhost/index.php/home/user/login/var/value/
PATHINFO地址的前三個引數分別表示模組/控制器/操作。PATHINFO模式下面,URL是可定製的,例如,通過下面的配置:
'URL_PATHINFO_DEPR'=>'-',// 更改PATHINFO引數分隔符
我們可以支援下面的URL訪問:
http://localhost/index.php/home-user-login-var-value
REWRITE模式:是在PATHINFO模式的基礎上新增了重寫規則的支援,可以去掉URL地址裡面的入口檔案index.php,但是需要額外配置WEB伺服器的重寫規則。
如果是Apache則需要在入口檔案的同級新增.htaccess檔案,內容如下:
<IfModulemod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule>
接下來就可以使用下面的URL地址訪問了
http://localhost/app/module/action/var/value/
相容模式:是用於不支援PATHINFO的特殊環境,URL地址是:
http://localhost/?s=/home/user/login/var/value
相容模式配合Web伺服器重寫規則的定義,可以達到和REWRITE模式一樣的URL效果。
檢視
ThinkPHP內建了一個編譯型模板引擎,也支援原生的PHP模板,並且還提供了包括Smarty在內的模板引擎驅動。和Smarty不同,ThinkPHP在渲染模板的時候如果不指定模板,則會採用系統預設的定位規則,其定義規範預設是模組目錄下面的 View/控制器名/操作名.html,所以,Index模組的index操作的預設模板檔案位於Home模組目錄下面的View/Index/index.html,我們新增模板內容如下:
<html> <head> <title>hello {$name}</title> </head> <body> hello, {$name}! </body> </html>
要輸出檢視,必須在控制器方法中進行模板渲染輸出操作,例如:
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function hello(){ $this->assign('name','thinkphp'); $this->display(); } }
display方法中我們沒有指定任何模板,所以按照系統預設的規則輸出了Index/index.html模板檔案。
接下來,我們在瀏覽器訪問輸出:
hello,thinkphp!
讀取資料
在開始之前,我們首先在資料庫thinkphp中建立一個think_data資料表(以mysql資料庫為例):
CREATE TABLE IF NOT EXISTS `think_data`( `id`int(8)unsigned NOT NULL AUTO_INCREMENT, `data` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; INSERT INTO `think_data`(`id`,`data`) VALUES (1,'thinkphp'), (2,'php'), (3,'framework');
如果我們需要讀取資料庫中的資料,就需要在模組配置檔案中新增資料庫連線資訊如下:
// 新增資料庫配置資訊 'DB_TYPE'=>'mysql',// 資料庫型別 'DB_HOST'=>'localhost',// 伺服器地址 'DB_NAME'=>'thinkphp',// 資料庫名 'DB_USER'=>'root',// 使用者名稱 'DB_PWD'=>'',// 密碼 'DB_PORT'=>3306,// 埠 'DB_PREFIX'=>'think_',// 資料庫表字首
或者採用如下配置
'DB_DSN'=>'mysql://root@localhost:3306/thinkphp', 'DB_PREFIX'=>'think_',// 資料庫表字首
使用DB_DSN方式定義可以簡化配置引數,DSN引數格式為:
資料庫型別://使用者名稱:密碼@資料庫地址:資料庫埠/資料庫名
如果兩種配置引數同時存在的話,DB_DSN配置引數優先。
接下來,我們修改下控制器方法,新增讀取資料的程式碼:
namespace Home\Controller; use Think\Controller; class IndexController extends Controller{ public function index(){ $Data = M('Data');// 例項化Data資料模型 $result = $Data->find(1); $this->assign('result',$result); $this->display(); } }
這裡用到了M函式,是ThinkPHP內建的例項化模型的方法,而且用M方法例項化模型不需要建立對應的模型類,你可以理解為M方法是直接在操作底層的Model類,而Model類具備基本的CURD操作方法。
M('Data') 例項化後,就可以對think_data資料表(think_ 是我們在專案配置檔案中定義的資料表字首)進行操作(包括CURD)了,M函式的用法還有很多,我們以後會深入瞭解。
定義好控制器後,我們修改模板檔案,新增資料輸出標籤如下:
<html> <head> <title></title> </head> <body> {$result.id}--{$result.data} </body> </html>volist標籤是內建模板引擎用於輸出資料集的標籤。{$vo.id} 和 {$vo.data} 的用法和Smarty類似,就是用於輸出資料的欄位,這裡就表示輸出think_data表的id和data欄位的值。
我們訪問會輸出:
1--thinkphp
如果發生錯誤,檢查你是否開啟了除錯模式或者清空Runtime目錄下面的快取檔案。
如果你看到了上面的輸出結果,那麼恭喜你已經拿到了入門ThinkPHP的鑰匙!
總結
本篇我們學習了ThinkPHP的目錄結構、URL模式,如何建立專案的入口檔案和開啟除錯模式,以及控制器、模板和模型的基礎認識,後面會繼續瞭解對資料的CURD操作。
回覆
咋感覺官網的手冊重寫貼上一邊啊。
評論
希望後續繼續更新,多提到現實中遇到的問題。
評論
我現在想開始做網站,不知道從何入手,請賜教
評論
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function hello(){ echo 'hello,thinkphp!'; } }這一段應該是有問題的吧,方法名應該是index
評論
非常贊,繼續更新啊。。。
評論
繼續更新吧