ThinkPHP3.2 快速入門(1)基礎

發表於2019-05-11
簡介

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),開發人員可以在這個基礎之上靈活調整(目錄名稱和位置)。其中,ApplicationPublic目錄下面都是空的,而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
評論
非常贊,繼續更新啊。。。
評論
繼續更新吧
評論

相關文章