## 練習(xí)1:Hello,ThinkPHP
>[info] 任務(wù):在安裝完成后來完成第一個實例代碼,要求運行后顯示`Hello,ThinkPHP!`。
### 實現(xiàn)一:路由實現(xiàn)
針對這個需求的最簡單實現(xiàn),是在路由定義文件(`route/route.php`)開頭添加如下代碼:
~~~
Route::get('/', function () {
return 'Hello,ThinkPHP!';
});
~~~
然后直接訪問(這里使用了上一個練習(xí)的內(nèi)容提到的`Vhost`訪問)
~~~
http://tp5.com
~~~
頁面輸出:
~~~
Hello,ThinkPHP!
~~~
是不是很簡單?直接通過路由定義返回頁面輸出內(nèi)容(更多的路由用法我們后面還會陸續(xù)提到,暫且不表)。接下來,我們來看第二種實現(xiàn)代碼,通過標(biāo)準(zhǔn)的控制器來實現(xiàn)。
### 實現(xiàn)二:控制器實現(xiàn)
進(jìn)入`CMD`命令行,切換到應(yīng)用根目錄(也就是`tp5`目錄),執(zhí)行下面的指令:
~~~
php think make:controller index/Hello --plain
~~~
會自動生成一個控制器文件,位于:
~~~
application/index/controller/Hello.php
~~~
在編輯器打開,可以看到已經(jīng)生成了一個空的控制器(類)文件
~~~
<?php
namespace app\index\controller;
use think\Controller;
class Hello extends Controller
{
//
}
~~~
> 后面再提到控制器的時候,你的第一反應(yīng)就是這個`controller`目錄下面的某個類,而且從類名就能直觀看出控制器名,從命名空間可以找到所在位置。
我們在控制器類里面添加一個`index`方法(必須使用`public`類型,一般我們稱為操作方法,它是URL訪問的最小單元),內(nèi)容如下:
~~~
<?php
namespace app\index\controller;
use think\Controller;
class Hello extends Controller
{
// 顯示歡迎頁面
public function index()
{
return 'Hello,ThinkPHP!';
}
}
~~~
> 今后提到控制器的某個操作,你的第一反應(yīng)就是去找這個控制器下面的某個方法。
然后我們直接在瀏覽器中訪問
~~~
http://tp5.com/index/hello
~~~
頁面輸出:
~~~
Hello,ThinkPHP!
~~~
至此,我們完成了一個標(biāo)準(zhǔn)的控制器輸出`Hello,ThinkPHP`的實現(xiàn)代碼。
## 拓展討論
### 為何用`return`而不用`echo`
我們看到控制器的操作方法都是直接`return`的,而沒有使用我們習(xí)慣的`echo`方法輸出。你會發(fā)現(xiàn)使用`echo`輸出的話,最終的結(jié)果其實是一樣的,但為什么不建議使用呢?
確實,如果你要輸出的數(shù)據(jù)本身就是字符串的話,使用`echo`的結(jié)果是一樣的,但ThinkPHP的控制器操作方法支持不同的響應(yīng)輸出(甚至需要設(shè)置不同的頭信息),對于不同的響應(yīng)輸出會調(diào)用不同的`Response`子類,例如`JSON`、`XML`等,你可以直接`return`一個數(shù)組或者對象數(shù)據(jù),然后交給`Response`來處理轉(zhuǎn)換,甚至你可以直接return一個`Response`對象。還有一種情況是,你可以統(tǒng)一使用系統(tǒng)提供的鉤子對響應(yīng)輸出進(jìn)行額外的處理,而如果你使用了`echo`直接輸出,將無法享受這些功能特性。
>[info] 關(guān)于更多的`Response`響應(yīng)處理的知識,我們后面還會陸續(xù)提到,暫且不用深究,但請保持操作方法統(tǒng)一`return`的習(xí)慣(除非在操作方法中間進(jìn)行調(diào)試的時候可以使用`echo`或者`dump`)。
### 更優(yōu)雅的URL
是否覺得
~~~
http://tp5.com/index/hello
~~~
這個訪問地址有點太長了,似乎不夠優(yōu)雅,沒關(guān)系,我們馬上來改進(jìn)下。
打開路由定義文件`route/route.php`,添加一行代碼如下:
~~~
Route::get('hello','Hello/index');
~~~
現(xiàn)在你可以優(yōu)雅的訪問
~~~
http://tp5.com/hello
~~~
輸出同樣的內(nèi)容。
### 添加URL變量
我們希望歡迎頁面能顯示輸入的名稱,而不是ThinkPHP,就需要用到URL變量,我們分別針對上述兩種實現(xiàn)來進(jìn)行調(diào)整。
如果是第一種,我們修改路由定義如下:
~~~
Route::get('hello/:name', function ($name) {
return 'Hello,' . $name . '!';
});
~~~
>[info] 你暫時不用深究路由傳遞參數(shù)的原理,你只需要記得使用`:name`就表示URL中輸入的變量,然后可以在閉包中調(diào)用該同名變量。
直接訪問
~~~
http://tp5.com/hello/張三
~~~
頁面輸出結(jié)果:
~~~
Hello,張三!
~~~
你可以嘗試更改URL地址`hello`后面的名稱來查看輸出結(jié)果。
如果是第二種實現(xiàn),首先把路由定義改成
~~~
Route::get('hello/:name','Hello/index');
~~~
然后對`Hello`控制器類的`index`方法稍加調(diào)整。
~~~
<?php
namespace app\index\controller;
use think\Controller;
class Hello extends Controller
{
// 顯示歡迎頁面
public function index($name='ThinkPHP')
{
return 'Hello,' . $name . !';
}
}
~~~
>[info] 沒有比這更神奇的事情了,路由地址中的變量`name`可以很神奇的傳遞到`index`方法中。
直接訪問
~~~
http://tp5.com/hello/李四
~~~
頁面輸出結(jié)果:
~~~
Hello,李四!
~~~
### 添加類庫后綴
為了盡量避免關(guān)鍵字的沖突,我們可以統(tǒng)一開啟類庫后綴功能,在應(yīng)用根目錄下的`config`目錄下找到`app.php`文件,打開后更改下面的配置參數(shù):
~~~
// 開啟應(yīng)用類庫后綴
'class_suffix' => true,
~~~
開啟后,你所有的類庫都要統(tǒng)一加上你的目錄名稱(首字母大寫)作為類庫名的后綴(同時千萬別忘了,文件名也要同時調(diào)整成和類名一樣),例如:
~~~
<?php
namespace app\index\controller;
use think\Controller;
class HelloController extends Controller
{
// 顯示歡迎頁面
public function index()
{
return 'Hello,ThinkPHP!';
}
}
~~~
在你需要創(chuàng)建一個新控制器的時候,可以使用下面的命令:
~~~
php think make:controller index/TestController --plain
~~~
會自動生成一個控制器文件,位于:
~~~
application/index/controller/TestController.php
~~~
>[danger] 后面的練習(xí)如果沒有特殊說明,都不開啟應(yīng)用類庫后綴。
- 前言
- 練習(xí)0:安裝和準(zhǔn)備
- 練習(xí)1:Hello,ThinkPHP
- 練習(xí)2:添加操作方法
- 練習(xí)3:注冊簡單路由
- 練習(xí)4:使用注解路由
- 練習(xí)5:輸出請求信息
- 練習(xí)6:獲取請求變量
- 練習(xí)7:添加404頁面
- 練習(xí)8:添加模板輸出
- 練習(xí)9:使用模板變量
- 練習(xí)10:頁面重定向
- 練習(xí)11:查詢數(shù)據(jù)(一)
- 練習(xí)12:查詢數(shù)據(jù)(二)
- 練習(xí)13:查詢數(shù)據(jù)(三)
- 練習(xí)14:查詢數(shù)據(jù)(四)
- 練習(xí)15:寫入數(shù)據(jù)(一)
- 練習(xí)16:寫入數(shù)據(jù)(二)
- 練習(xí)17:寫入數(shù)據(jù)(三)
- 練習(xí)18:更新數(shù)據(jù)
- 練習(xí)19:刪除數(shù)據(jù)
- 練習(xí)20:獲取一列數(shù)據(jù)
- 練習(xí)21:獲取某個字段值