本節描述如何在您的應用程式中建立新的「Hello」頁面。為了達成此目標,您將建立一個動作和一個視圖
透過本教學,您將學習三件事
對於「Hello」任務,您將建立一個 say
動作,從請求中讀取 message
參數,並將該訊息顯示回使用者。如果請求未提供 message
參數,則該動作將顯示預設的「Hello」訊息。
動作必須在控制器中宣告。為了簡潔起見,您可以將 say
動作宣告在現有的 SiteController
中。此控制器在類別檔案 controllers/SiteController.php
中定義。以下是新動作的開頭
<?php
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
// ...existing code...
public function actionSay($message = 'Hello')
{
return $this->render('say', ['message' => $message]);
}
}
在上面的程式碼中,say
動作定義為 SiteController
類別中名為 actionSay
的方法。Yii 使用前綴 action
來區分控制器類別中的動作方法與非動作方法。action
前綴之後的名稱會對應到動作的 ID。
在命名動作時,您應該了解 Yii 如何處理動作 ID。動作 ID 始終以小寫形式引用。如果動作 ID 需要多個單字,它們將以破折號連接(例如,create-comment
)。動作方法 ID 透過從 ID 中移除任何破折號、將每個單字的第一個字母大寫,並在結果字串前加上 action
來對應到動作名稱。例如,動作 ID create-comment
對應到動作方法名稱 actionCreateComment
。
我們範例中的動作方法接受一個參數 $message
,其值預設為 "Hello"
(與您在 PHP 中為任何函式或方法引數設定預設值的方式完全相同)。當應用程式收到請求並確定 say
動作負責處理該請求時,應用程式將使用在請求中找到的同名參數來填充此參數。換句話說,如果請求包含一個值為 "Goodbye"
的 message
參數,則動作內的 $message
變數將被賦予該值。
在動作方法中,呼叫 render() 以渲染名為 say
的視圖檔案。message
參數也會傳遞給視圖,以便在那裡使用。渲染結果由動作方法傳回。該結果將被應用程式接收並在瀏覽器中向終端使用者顯示(作為完整 HTML 頁面的一部分)。
視圖是您編寫用於產生回應內容的腳本。對於「Hello」任務,您將建立一個 say
視圖,列印從動作方法接收的 message
參數
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
say
視圖應儲存在檔案 views/site/say.php
中。當在動作中呼叫 render() 方法時,它將尋找名為 views/ControllerID/ViewName.php
的 PHP 檔案。
請注意,在上面的程式碼中,message
參數在列印之前已進行 HTML 編碼。這是必要的,因為該參數來自終端使用者,使其容易受到透過在參數中嵌入惡意 JavaScript 程式碼的 跨網站腳本 (XSS) 攻擊。
當然,您可以在 say
視圖中放置更多內容。內容可以包含 HTML 標籤、純文字,甚至 PHP 語句。實際上,say
視圖只是一個由 render() 方法執行的 PHP 腳本。視圖腳本列印的內容將作為回應結果傳回給應用程式。應用程式將反過來將此結果輸出給終端使用者。
建立動作和視圖後,您可以透過存取以下 URL 來存取新頁面
https://hostname/index.php?r=site%2Fsay&message=Hello+World
此 URL 將產生一個顯示「Hello World」的頁面。該頁面與其他應用程式頁面共享相同的頁首和頁尾。
如果您在 URL 中省略 message
參數,您將看到頁面僅顯示「Hello」。這是因為 message
作為參數傳遞給 actionSay()
方法,當省略時,將改為使用預設值 "Hello"
。
資訊: 新頁面與其他頁面共享相同的頁首和頁尾,因為 render() 方法會自動將
say
視圖的結果嵌入到所謂的佈局中,在本例中,佈局位於views/layouts/main.php
。
上述 URL 中的 r
參數需要更多解釋。它代表路由,這是一個應用程式範圍內唯一的 ID,用於引用動作。路由的格式為 ControllerID/ActionID
。當應用程式收到請求時,它將檢查此參數,使用 ControllerID
部分來確定應實例化哪個控制器類別來處理請求。然後,控制器將使用 ActionID
部分來確定應實例化哪個動作來完成實際工作。在本例中,路由 site/say
將解析為 SiteController
控制器類別和 say
動作。因此,將呼叫 SiteController::actionSay()
方法來處理請求。
資訊: 與動作一樣,控制器也有 ID,可在應用程式中唯一識別它們。控制器 ID 使用與動作 ID 相同的命名規則。控制器類別名稱是從控制器 ID 派生的,方法是從 ID 中移除破折號、將每個單字的第一個字母大寫,並在結果字串後加上單字
Controller
。例如,控制器 IDpost-comment
對應到控制器類別名稱PostCommentController
。
在本節中,您接觸了 MVC 架構模式的控制器和視圖部分。您建立了一個動作作為控制器的一部分,以處理特定請求。並且您還建立了一個視圖來組成回應的內容。在這個簡單的範例中,沒有涉及模型,因為唯一使用的資料是 message
參數。
您還了解了 Yii 中的路由,它充當使用者請求與控制器動作之間的橋樑。
在下一節中,您將學習如何建立模型,並新增一個包含 HTML 表單的新頁面。
發現錯字或您認為此頁面需要改進?
在 github 上編輯 !
註冊 或 登入 以發表評論。