1
2
3
4
5
6
7
8
9
10
11
12
|
tp5 ├─application
應用目錄 ├─extend
擴展類庫目錄(可定義) ├─ public
網站對外訪問目錄 ├─runtime
運行時目錄(可定義) ├─vendor
第三方類庫目錄(Composer) ├─thinkphp
框架核心目錄 ├─build.php
自動生成定義文件(參考) ├─composer.json
Composer定義文件 ├─LICENSE.txt
授權說明文件 ├─README.md
README 文件 ├─think
命令行工具入口 |
注意:
如果在linux環境下面的話,需要給runtime目錄755權限。
有幾個關鍵的路徑先了解下:
目錄 | 說明 | 常量 |
---|---|---|
tp5 | 項目根目錄 | ROOT_PATH |
tp5/application | 應用目錄 | APP_PATH |
tp5/thinkphp | 框架核心目錄 | THINK_PATH |
tp5/exend | 應用擴展目錄 | EXTEND_PATH |
tp5/vendor | Composer擴展目錄 | VENDOR_PATH |
核心框架目錄的結構如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
├─thinkphp
框架系統目錄 │
├─lang 語言包目錄 │
├─library 框架核心類庫目錄 │
│ ├─think think 類庫包目錄 │
│ └─traits 系統 traits 目錄 │
├─tpl 系統模板目錄 │
│ │
├─.htaccess 用於 apache 的重寫 │
├─.travis.yml CI 定義文件 │
├─base.php 框架基礎文件 │
├─composer.json composer 定義文件 │
├─console.php 控制檯入口文件 │
├─convention.php 慣例配置文件 │
├─helper.php 助手函數文件(可選) │
├─LICENSE.txt 授權說明文件 │
├─phpunit.xml 單元測試配置文件 │
├─README.md README 文件 │
└─start.php 框架引導文件 |
運行環境
ThinkPHP5的環境要求如下:
- PHP >= 5.4.0 (完美支持PHP7)PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension
在開始之前,你需要一個Web服務器和PHP5.4+運行環境,如果你暫時還沒有,我們推薦使用集成開發環境WAMPServer(Windows系統下集成Apache、PHP和MySQL的服務套件)來使用ThinkPHP進行本地開發和測試,最新版本的WAMP在這裏下載。
如果你不想安裝任何WEB服務器,也可以直接使用PHP自帶的WebServer,並且運行router.php來運行測試。
我們進入命令行,進入tp5/public目錄後,輸入如下命令:
1
|
php
-S localhost: 8888
router.php |
接下來可以直接訪問
1
|
http: //localhost:8888 |
注意: S 一定要大寫,端口號可以隨意設置,只要和已有的不衝突,如果要停止服務,直接在命令行下面按CTRL+C即可退出。
入口文件
ThinkPHP5.0版本的默認自帶的入口文件位於public/index.php(實際部署的時候public目錄爲你的應用對外訪問目錄),入口文件內容如下:
1
2
3
4
|
//
定義應用目錄 define( 'APP_PATH' ,
__DIR__ . '/../application/' ); //
加載框架引導文件 require
__DIR__ . '/../thinkphp/start.php' ; |
這段代碼的作用就是定義應用目錄APP_PATH和加載ThinkPHP框架的入口文件,這是所有基於ThinkPHP開發應用的第一步。
我們可以在瀏覽器中訪問入口文件
1
|
http: //localhost/tp5/public/ |
運行後我們會看到歡迎頁面:
官方提供的默認應用的實際目錄結構和說明如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
├─application
應用目錄(可設置) │
├─index 模塊目錄(可更改) │
│ ├─config.php 模塊配置文件 │
│ ├─common.php 模塊公共文件 │
│ ├─controller 控制器目錄 │
│ ├─model 模型目錄 │
│ └─view 視圖目錄 │
│ │
├─command.php 命令行工具配置文件 │
├─common.php 應用公共文件 │
├─config.php 應用配置文件 │
├─tags.php 應用行爲擴展定義文件 │
├─database.php 數據庫配置文件 │
└─route.php 路由配置文件 |
5.0版本採用模塊化的設計架構,默認的應用目錄下面只有一個index模塊目錄,如果我要添加新的模塊可以使用控制檯命令來生成。
切換到命令行模式下,進入到應用根目錄並執行如下指令:
1
|
php
think build --module demo |
就會生成一個默認的demo模塊,包括如下目錄結構:
1
2
3
4
5
6
|
├─demo
│
├─controller 控制器目錄 │
├─model 模型目錄 │
├─view 視圖目錄 │
├─config.php 模塊配置文件 │
└─common.php 模塊公共文件 |
同時也會生成一個默認的Index控制器文件。
注意:這只是一個初始默認的目錄結構,在實際的開發過程中可能需要創建更多的目錄和文件。
在後面的示例中,爲了方便訪問,我們設置vhost訪問,以apache爲例的話定義如下:
1
2
3
4
|
<virtualhost
: 80 = "" > DocumentRoot
"/home/www/tp5/public" ServerName
tp5.com </virtualhost> |
把DocumentRoot修改爲你本機tp5/public所在目錄,並注意修改本機的hosts文件把tp5.com指向本地127.0.0.1。
如果你暫時不想設置vhost或者還不是特別瞭解如何設置,可以先把入口文件移動到框架的ROOT_PATH目錄,並更改入口文件中的APP_PATH和框架入口文件的位置(這裏順便展示下如何更改相關目錄名稱),index.php文件內容如下:
1
2
3
4
|
//
定義應用目錄爲apps define( 'APP_PATH' ,
__DIR__ . '/apps/' ); //
加載框架引導文件 require
__DIR__ . '/think/start.php' ; |
這樣最終的應用目錄結構如下:
1
2
3
4
5
6
|
tp5 ├─index.php
應用入口文件 ├─apps
應用目錄 ├─ public
資源文件目錄 ├─runtime
運行時目錄 └─think
框架目錄 |
實際的訪問URL變成了
1
|
http: //localhost/tp5/ |
提示:
如非特別說明,我們後面的示例均以tp5.com進行訪問,如果你使用了其它的方式請自行修改。
調試模式
ThinkPHP支持調試模式,默認情況下是開啓狀態。調試模式以除錯方便優先,而且在異常的時候可以顯示儘可能多的信息,所以對性能有一定的影響。
我們強烈建議開發者在使用ThinkPHP開發的過程中使用調試模式,5.0默認情況下可以捕獲到任何細微的錯誤並拋出異常,這樣可以更好的獲取錯誤提示和避免一些問題和隱患。
開發完成後,我們實際進行項目部署的時候,修改應用配置文件(application/config.php)中的app_debug配置參數:
1
2
|
//
關閉調試模式 'app_debug'
=> false , |
爲了安全考慮,避免泄露你的服務器WEB目錄信息等資料,一定記得正式部署的時候關閉調試模式。
控制器
我們找到index模塊的Index控制器(文件位於application/index/controller/Index.php注意大小寫),我們把Index控制器類的index方法修改爲Hello,World!。
1
2
3
4
5
6
7
8
9
10
|
<!--?php namespace
app\index\controller; class
Index { public
function index() { return
'Hello,World!' ; } }</pre--> |
提示:
根據類的命名空間可以快速定位文件位置,在ThinkPHP5.0的規範裏面,命名空間其實對應了文件的所在目錄,app命名空間通常代表了文件的起始目錄爲application,而think命名空間則代表了文件的其實目錄爲thinkphp/library/think,後面的命名空間則表示從起始目錄開始的子目錄。
我們訪問URL地址
1
|
http: //tp5.com |
就會看到Hello,World!的輸出結果。
如果要繼承一個公共的控制器類,可以使用:
123456789101112<!--?php
namespace app\index\controller;
use app\index\controller\Base;
class
Index
extends
Base
{
public
function index()
{
return
'Hello,World!'
;
}
}</pre-->
可以爲操作方法定義參數,例如:
1
2
3
4
5
6
7
8
9
10
|
<!--?php namespace
app\index\controller; class
Index { public
function index($name = 'World' ) { return
'Hello,'
. $name . '!' ; } }</pre--> |
當我們帶name參數訪問入口文件地址(例如http://tp5.com?name=ThinkPHP)的時候,在瀏覽器中可以看到如下輸出:
Hello,ThinkPHP!
控制器類可以包括多個操作方法,但如果你的操作方法是protected或者private類型的話,是無法直接通過URL訪問到該操作的,也就是說只有public類型的操作纔是可以通過URL訪問的。
我們來驗證下,把Index控制器類的方法修改爲:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<!--?php namespace
app\index\controller; class
Index { public
function hello() { return
'hello,thinkphp!' ; } public
function test() { return
'這是一個測試方法!' ; } protected
function hello2() { return
'只是protected方法!' ; } private
function hello3() { return
'這是private方法!' ; } }</pre--> |
當我們訪問如下URL地址的時候,前面兩個是正常訪問,後面兩個則會顯示異常。
1
2
3
4
|
http: //tp5.com/index.php/index/index/hello http: //tp5.com/index.php/index/index/test http: //tp5.com/index.php/index/index/hello2 http: //tp5.com/index.php/index/index/hello3 |
當我們訪問hello2和hello3操作方法後的結果都會顯示類似的異常信息:
異常頁面包含了詳細的錯誤信息,是因爲開啓了調試模式,如果關閉調試模式的話,看到的默認信息如下:
視圖
現在我們在給控制器添加視圖文件功能,我們在application/index目錄下面創建一個view目錄,然後添加模板文件view/index/hello.html,我們添加模板內容如下:
1
|
|
要輸出視圖,必須在控制器方法中進行模板渲染輸出操作,現在修改控制器類如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!--?php namespace
app\index\controller; use
think\Controller; class
Index extends
Controller { public
function hello($name = 'thinkphp' ) { $ this --->assign( 'name' ,
$name); return
$ this ->fetch(); } } |
[ 新手須知 ]
這裏使用了use來導入一個命名空間的類庫,然後可以在當前文件中直接使用該別名而不需要使用完整的命名空間路徑訪問類庫。也就說,如果沒有使用
1use think\Controller;
就必須使用
1class
Index
extends
\think\Controller
這種完整命名空間方式。
在後面的內容中,如果我們直接調用系統的某個類的話,都會假設已經在類的開頭使用use進行了別名導入。
注意,Index控制器類繼承了think\Controller類之後,我們可以直接使用封裝好的assign和fetch方法進行模板變量賦值和渲染輸出。
fetch方法中我們沒有指定任何模板,所以按照系統默認的規則(視圖目錄/控制器/操作方法)輸出了view/index/hello.html模板文件。
接下來,我們在瀏覽器訪問
1
|
http: //tp5.com/index.php/index/index/hello |
輸出:
hello,thinkphp!
讀取數據
在開始之前,我們首先在數據庫demo中創建一個think_data數據表(這裏以mysql數據庫爲例):
1
2
3
4
5
6
7
8
9
10
|
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' ); |
首先我們需要在應用的數據庫配置文件application/database.php中添加數據庫的連接信息如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
return
[ //
數據庫類型 'type'
=> 'mysql' , //
服務器地址 'hostname'
=> '127.0.0.1' , //
數據庫名 'database'
=> 'demo' , //
數據庫用戶名 'username'
=> 'root' , //
數據庫密碼 'password'
=> '' , //
數據庫連接端口 'hostport'
=> '' , //
數據庫連接參數 'params'
=> [], //
數據庫編碼默認採用utf8 'charset'
=> 'utf8' , //
數據庫表前綴 'prefix'
=> 'think_' , //
數據庫調試模式 'debug'
=> true , ]; |
接下來,我們修改下控制器方法,添加讀取數據的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!--?php namespace
app\index\controller; use
think\Controller; use
think\Db; class
Index extends
Controller { public
function index() { $data
= Db::name( 'data' )--->find(); $ this ->assign( 'result' ,
$data); return
$ this ->fetch(); } } |
定義好控制器後,我們修改模板文件,添加數據輸出標籤如下:
1
|
|
模板標籤的用法和Smarty類似,就是用於輸出數據的字段,這裏就表示輸出think_data表的id和data字段的值。
我們訪問會輸出:
1--thinkphp
總結
本章我們學習瞭如何安裝ThinkPHP和框架的目錄結構,如何創建項目的入口文件和開啓調試模式,並通過一個Hello,Name例子說明了如何定義控制器和模板,以及如何讀取數據庫的數據並在模板渲染輸出。