第一個程序HelloWord


 

說聲 Hello


本章節描述瞭如何在你的應用中創建一個新的 「Hello」 頁面。爲了做到這點,將會創建一個[操作]和一個[視圖]:

* 應用將會分派頁面請求給操作
* 操作將會依次渲染視圖呈現 「Hello」 給最終用戶

貫穿整個章節,你將會掌握三件事:

1. 如何創建一個[操作]去響應請求,
2. 如何創建一個[視圖]去構造響應內容,
3. 以及一個應用如何分派請求給[操作]。

創建操作 

爲了說 「Hello」,需要創建一個 `say` [操作],從請求中接收 `message` 參數並顯示給最終用戶。如果請求沒有提供 `message` 參數,操作將顯示默認參數 「Hello」。

> 補充:[操作]是最終用戶可以直接訪問並執行的對象。操作被組織在[控制器]中。一個操作的執行結果就是最終用戶收到的響應內容。

操作必須聲明在[控制器]中。爲了簡單起見,你可以直接在 `SiteController` 控制器裏聲明 `say` 操作。這個控制器是由文件 `controllers/SiteController.php` 定義的。以下是一個操作的聲明:
<?php
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
    // ...其它代碼...
    public function actionSay($message = '你好')
    {
        return $this->render('say', ['message' => $message]);
    }
}
在上述 `SiteController` 代碼中,`say` 操作被定義爲 `actionSay` 方法。Yii 使用 `action` 前綴區分普通方法和操作。`action` 前綴後面的名稱被映射爲操作的 ID。

涉及到給操作命名時,你應該理解 Yii 如何處理操作 ID。操作 ID 總是被以小寫處理,如果一個操作 ID 由多個單詞組成,單詞之間將由連字符連接(如 `create-comment`)。操作 ID 映射爲方法名時移除了連字符,將每個單詞首字母大寫,並加上 `action` 前綴。 例子:操作 ID `create-comment` 相當於方法名 `actionCreateComment`。

上述代碼中的操作方法接受一個參數 `$message`,它的默認值是 `「Hello」`(就像你設置 PHP 中其它函數或方法的默認值一樣)。當應用接收到請求並確定由 `say` 操作來響應請求時,應用將從請求的參數中尋找對應值傳入進來。換句話說,如果請求包含一個 `message` 參數,它的值是 `「Goodybye」`, 操作方法中的 `$message` 變量也將被填充爲 `「Goodbye」`。

在操作方法中,[[yii\web\Controller::render()|render()]] 被用來渲染一個名爲 `say` 的[視圖](structure-views.md)文件。 `message` 參數也被傳入視圖,這樣就可以在裏面使用。操作方法會返回渲染結果。結果會被應用接收並顯示給最終用戶的瀏覽器(作爲整頁 HTML 的一部分)。

創建視圖 

[視圖]是你用來生成響應內容的腳本。爲了說 「Hello」,你需要創建一個 `say` 視圖,以便顯示從操作方法中傳來的 `message` 參數。
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>

`say` 視圖應該存爲 `views/site/say.php` 文件。當一個操作中調用了 [[yii\web\Controller::render()|render()]] 方法時,它將會按 `views/控制器 ID/視圖名.php` 路徑加載 PHP 文件。

注意以上代碼,`message` 參數在輸出之前被 [[yii\helpers\Html::encode()|HTML-encoded]] 方法處理過。這很有必要,當參數來自於最終用戶時,參數中可能隱含的惡意 JavaScript 代碼會導致[跨站腳本(XSS)攻擊](http://en.wikipedia.org/wiki/Cross-site_scripting)。

當然了,你大概會在 `say` 視圖裏放入更多內容。內容可以由 HTML 標籤,純文本,甚至 PHP 語句組成。實際上 `say` 視圖就是一個由 [[yii\web\Controller::render()|render()]] 執行的 PHP 腳本。視圖腳本輸出的內容將會作爲響應結果返回給應用。應用將依次輸出結果給最終用戶。

嘗試下 ​

創建完操作和視圖後,你就可以通過下面的 URL 訪問新頁面了:
http://hostname/index.php?r=site/say&message=Hello+World
[Hello World]

這個 URL 將會輸出包含 「Hello World」 的頁面,頁面和應用裏的其它頁面使用同樣的頭部和尾部。

如果你省略 URL 中的 `message` 參數,將會看到頁面只顯示 「Hello」。這是因爲 `message` 被作爲一個參數傳給 `actionSay()` 方法,當省略它時,參數將使用默認的 `「Hello」` 代替。

> 補充:新頁面和其它頁面使用同樣的頭部和尾部是因爲 [[yii\web\Controller::render()|render()]] 方法會自動把 `say` 視圖執行的結果嵌入稱爲[佈局]的文件中,本例中是 `views/layouts/main.php`。

上面 URL 中的參數 `r` 需要更多解釋。它代表[路由],是整個應用級的,指向特定操作的獨立 ID。路由格式是 `控制器 ID/操作 ID`。應用接受請求的時候會檢查參數,使用控制器 ID 去確定哪個控制器應該被用來處理請求。然後相應控制器將使用操作 ID 去確定哪個操作方法將被用來做具體工作。上述例子中,路由 `site/say` 將被解析至 `SiteController` 控制器和其中的 `say` 操作。因此 `SiteController::actionSay()` 方法將被調用處理請求。

> 補充:與操作一樣,一個應用中控制器同樣有唯一的 ID。控制器 ID 和操作 ID 使用同樣的命名規則。控制器的類名源自於控制器 ID,移除了連字符,每個單詞首字母大寫,並加上 `Controller` 後綴。例子:控制器 ID `post-comment` 相當於控制器類名 `PostCommentController`。

總結 ​

通過本章節你接觸了 MVC 設計模式中的控制器和視圖部分。創建了一個操作作爲控制器的一部分去處理特定請求。然後又創建了一個視圖去構造響應內容。在這個小例子中,沒有模型調用,唯一涉及到數據的地方是 `message` 參數。

你同樣學習了 Yii 路由的相關內容,它是用戶請求與控制器操作之間的橋樑。

下一章,你將學習如何創建一個模型,以及添加一個包含 HTML 表單的頁面。