第一次問候(Saying Hello)

2018-02-24 15:40 更新

說聲 Hello

本章描述了如何在你的應(yīng)用中創(chuàng)建一個(gè)新的 “Hello” 頁面。為了實(shí)現(xiàn)這一目標(biāo),將會創(chuàng)建一個(gè)操作和一個(gè)視圖

  • 應(yīng)用將會分派頁面請求給操作
  • 操作將會依次渲染視圖呈現(xiàn) “Hello” 給最終用戶

貫穿整個(gè)章節(jié),你將會掌握三件事:

  1. 如何創(chuàng)建一個(gè)操作去響應(yīng)請求,
  2. 如何創(chuàng)建一個(gè)視圖去構(gòu)造響應(yīng)內(nèi)容,
  3. 以及一個(gè)應(yīng)用如何分派請求給操作。

創(chuàng)建操作

為了 “Hello”,需要創(chuàng)建一個(gè)?say?操作,從請求中接收?message?參數(shù)并顯示給最終用戶。如果請求沒有提供?message?參數(shù),操作將顯示默認(rèn)參數(shù) “Hello”。

補(bǔ)充:操作是最終用戶可以直接訪問并執(zhí)行的對象。操作被組織在控制器中。一個(gè)操作的執(zhí)行結(jié)果就是最終用戶收到的響應(yīng)內(nèi)容。

操作必須聲明在控制器中。為了簡單起見,你可以直接在?SiteController?控制器里聲明?say?操作。這個(gè)控制器是由文件controllers/SiteController.php?定義的。以下是一個(gè)操作的聲明:

<?php

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    // ...其它代碼...

    public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
}

在上述?SiteController?代碼中,say?操作被定義為?actionSay?方法。Yii 使用?action?前綴區(qū)分普通方法和操作。action?前綴后面的名稱被映射為操作的 ID。

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

上述代碼中的操作方法接受一個(gè)參數(shù)?$message,它的默認(rèn)值是?“Hello”(就像你設(shè)置 PHP 中其它函數(shù)或方法的默認(rèn)值一樣)。當(dāng)應(yīng)用接收到請求并確定由?say?操作來響應(yīng)請求時(shí),應(yīng)用將從請求的參數(shù)中尋找對應(yīng)值傳入進(jìn)來。換句話說,如果請求包含一個(gè)message?參數(shù),它的值是?“Goodybye”, 操作方法中的?$message?變量也將被填充為?“Goodbye”。

在操作方法中,yii\web\Controller::render() 被用來渲染一個(gè)名為?say?的視圖文件。?message?參數(shù)也被傳入視圖,這樣就可以在里面使用。操作方法會返回渲染結(jié)果。結(jié)果會被應(yīng)用接收并顯示給最終用戶的瀏覽器(作為整頁 HTML 的一部分)。

創(chuàng)建視圖

視圖是你用來生成響應(yīng)內(nèi)容的腳本。為了說 “Hello”,你需要創(chuàng)建一個(gè)?say?視圖,以便顯示從操作方法中傳來的?message?參數(shù)。

<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>

say?視圖應(yīng)該存為?views/site/say.php?文件。當(dāng)一個(gè)操作中調(diào)用了 yii\web\Controller::render() 方法時(shí),它將會按?views/控制器 ID/視圖名.php?路徑加載 PHP 文件。

注意以上代碼,message?參數(shù)在輸出之前被 yii\helpers\Html::encode() 方法處理過。這很有必要,當(dāng)參數(shù)來自于最終用戶時(shí),參數(shù)中可能隱含的惡意 JavaScript 代碼會導(dǎo)致跨站腳本(XSS)攻擊。

當(dāng)然了,你大概會在?say?視圖里放入更多內(nèi)容。內(nèi)容可以由 HTML 標(biāo)簽,純文本,甚至 PHP 語句組成。實(shí)際上?say?視圖就是一個(gè)由 yii\web\Controller::render() 執(zhí)行的 PHP 腳本。視圖腳本輸出的內(nèi)容將會作為響應(yīng)結(jié)果返回給應(yīng)用。應(yīng)用將依次輸出結(jié)果給最終用戶。

試運(yùn)行

創(chuàng)建完操作和視圖后,你就可以通過下面的 URL 訪問新頁面了:

http://hostname/index.php?r=site/say&message=Hello+World

這個(gè) URL 將會輸出包含 “Hello World” 的頁面,頁面和應(yīng)用里的其它頁面使用同樣的頭部和尾部。

如果你省略 URL 中的?message?參數(shù),將會看到頁面只顯示 “Hello”。這是因?yàn)?message?被作為一個(gè)參數(shù)傳給?actionSay()?方法,當(dāng)省略它時(shí),參數(shù)將使用默認(rèn)的?“Hello”?代替。

補(bǔ)充:新頁面和其它頁面使用同樣的頭部和尾部是因?yàn)?yii\web\Controller::render() 方法會自動把?say?視圖執(zhí)行的結(jié)果嵌入稱為布局的文件中,本例中是?views/layouts/main.php。

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

補(bǔ)充:與操作一樣,一個(gè)應(yīng)用中控制器同樣有唯一的 ID??刂破?ID 和操作 ID 使用同樣的命名規(guī)則??刂破鞯念惷醋杂诳刂破?ID,移除了連字符,每個(gè)單詞首字母大寫,并加上?Controller?后綴。例子:控制器 ID?post-comment?相當(dāng)于控制器類名PostCommentController。

總結(jié)

通過本章節(jié)你接觸了 MVC 設(shè)計(jì)模式中的控制器和視圖部分。創(chuàng)建了一個(gè)操作作為控制器的一部分去處理特定請求。然后又創(chuàng)建了一個(gè)視圖去構(gòu)造響應(yīng)內(nèi)容。在這個(gè)小例子中,沒有模型調(diào)用,唯一涉及到數(shù)據(jù)的地方是?message?參數(shù)。

你同樣學(xué)習(xí)了 Yii 路由的相關(guān)內(nèi)容,它是用戶請求與控制器操作之間的橋梁。

下一章,你將學(xué)習(xí)如何創(chuàng)建一個(gè)模型,以及添加一個(gè)包含 HTML 表單的頁面。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號