このセクションでは、アプリケーションに新しい「Hello」ページを作成する方法について説明します。この目標を達成するために、アクションとビューを作成します。
このチュートリアルを通して、次の3つのことを学習します。
「Hello」タスクでは、リクエストからmessage
パラメーターを読み取り、そのメッセージをユーザーに表示するsay
アクションを作成します。リクエストがmessage
パラメーターを提供しない場合、アクションはデフォルトの「Hello」メッセージを表示します。
情報:アクションは、エンドユーザーが直接参照して実行できるオブジェクトです。アクションはコントローラーによってグループ化されます。アクションの実行結果は、エンドユーザーが受信するレスポンスです。
アクションはコントローラーで宣言する必要があります。簡単にするために、既存のSiteController
でsay
アクションを宣言できます。このコントローラーは、クラスファイル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
をプレフィックスすることで、アクション名にマップされます。たとえば、アクションIDcreate-comment
は、アクションメソッド名actionCreateComment
に対応します。
この例のアクションメソッドは、パラメーター$message
を取ります。この値はデフォルトで"Hello"
です(PHPで関数またはメソッドの引数のデフォルト値を設定する方法とまったく同じです)。アプリケーションがリクエストを受信し、say
アクションがそのリクエストの処理を担当すると判断すると、アプリケーションはこのパラメーターを、リクエストに見つかった同じ名前のパラメーターで設定します。言い換えれば、リクエストにmessage
パラメーターが含まれていて、その値が"Goodbye"
の場合、アクション内の$message
変数にはその値が代入されます。
アクションメソッド内では、render()が呼び出され、say
という名前のビューファイルがレンダリングされます。message
パラメーターもビューに渡されるため、そこで使用できます。レンダリングの結果は、アクションメソッドによって返されます。その結果はアプリケーションによって受信され、ブラウザに表示されます(完全なHTMLページの一部として)。
「ビュー」は、レスポンスのコンテンツを生成するために記述するスクリプトです。「Hello」タスクでは、アクションメソッドから受け取った`message`パラメータを出力する`say`ビューを作成します。
<?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からダッシュを削除し、各単語の最初の文字を大文字にし、結果の文字列に`Controller`という単語を追加することで導き出されます。たとえば、コントローラのID`post-comment`は、コントローラクラス名`PostCommentController`に対応します。
このセクションでは、MVCアーキテクチャパターンのコントローラとビューの部分に触れました。特定のリクエストを処理するためにコントローラの一部としてアクションを作成しました。また、レスポンスのコンテンツを作成するためにビューも作成しました。この簡単な例では、使用されたデータが`message`パラメータのみであったため、モデルは含まれていませんでした。
Yiiのルートについても学習しました。ルートは、ユーザーのリクエストとコントローラの動作を仲介する役割を果たします。
次のセクションでは、モデルの作成方法と、HTMLフォームを含む新しいページの追加方法について学習します。
タイプミスを見つけた場合、またはこのページの改善が必要だと考える場合は、
Githubで編集してください !
コメントするにはサインアップまたはログインしてください。