こんにちは、と言う ¶
このセクションでは、アプリケーションに「こんにちは」という新しいページを作成する方法を説明します。 この目的を達するために、アクション と ビュー を作成します。
- アプリケーションは、このページへのリクエストをそのアクションに送付します。
- 次にそのアクションが「こんにちは」という言葉をエンド・ユーザに示すビューを表示します。
このチュートリアルを通じて、三つのことを学びます。
アクションを作成する ¶
「こんにちは」のタスクのために、リクエストから message
パラメータを読んで、そのメッセージをユーザに表示して返す
say
アクション を作ります。
リクエストが message
パラメータを提供しなかった場合は、アクションはデフォルト値として "こんにちは" というメッセージを表示するものとします。
Info: アクション は、エンド・ユーザが直接に参照して実行できるオブジェクトです。 アクションは コントローラ によってグループ化されます。 アクションの実行結果が、エンド・ユーザが受け取るレスポンスです。
アクションは コントローラ の中で宣言されなければなりません。
話を簡単にするために、say
アクションを既存の SiteController
の中で宣言しましょう。
このコントローラは 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
というパラメータを取り、そのデフォルト値は "こんにちは"
です
(PHP で関数やメソッドの引数にデフォルト値を設定するのと全く同じ方法です)。
アプリケーションがリクエストを受け取って、当該リクエストの処理を say
アクションが担当すべきであると決定した場合は、
リクエストの中に見つかった同じ名前のパラメータの値をこの $message
パラメータに代入します。
言い換えれば、もしリクエストの中に "さようなら"
という値の message
パラメータが入っていれば、アクションの $message
変数にその値が割り当てられます。
アクション・メソッドの中では、render() が呼ばれて say
と言う名前の ビュー ファイルがレンダリングされます。
message
パラメータも同時にビューに渡され、そこで使用されます。
レンダリング結果はアクション・メソッドによって返されます。
返された結果はアプリケーションによって受け取られ、ブラウザ上でエンド・ユーザに (完全な HTML ページの一部として) 表示されます。
ビューを作成する ¶
ビュー は、レスポンスのコンテントを生成するために書かれるスクリプトです。
「こんにちは」のタスクのためには、アクション・メソッドから受け取った message
パラメータを出力する say
ビューを作成します。
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
say
ビューは views/site/say.php
というファイルに保存しなければなりません。
アクションの中で render() メソッドが呼ばれるとき、render()
メソッドは views/ControllerID/ViewName.php
という名前の PHP ファイルを探します。
上記のコードで message
パラメータが出力される前に HTML-エンコード されていることに注意してください。
パラメータはエンド・ユーザから来るものであり、悪意のある JavaScript コードを埋め込まれて
クロス・サイト・スクリプティング (XSS) 攻撃 に使われうるものですから、
脆弱性を防止するためにこうすることが必要です。
当然ながら、say
ビューにはもっと多くのコンテントを入れても構いません。コンテントには、HTML タグ、平文テキスト、さらには PHP 文を含めることが出来ます。
実際、say
ビューは render() メソッドによって実行される PHP スクリプトであるに過ぎません。
ビュー・スクリプトによって出力されたコンテントはレスポンス結果としてアプリケーションに返されます。そしてアプリケーションがこの結果をエンド・ユーザに対して出力します。
試してみる ¶
アクションとビューを作成したら、下記の URL で新しいページにアクセスすることが出来ます。
http://hostname/index.php?r=site%2Fsay&message=Hello+World
この URL は、結果として、"Hello World" を表示するページになります。このページはアプリケーションの他のページと同じヘッダとフッタを共有しています。
URL から message
パラメータを省略すると、"こんにちは" を表示するページを見ることになるでしょう。
これは、message
が actionSay()
メソッドにパラメータとして渡されるものであり、それが省略された場合には、デフォルト値である "こんにちは"
が代りに使われるからです。
Info: 新しいページは他のページと同じヘッダとフッタを共有していますが、それは render() メソッドが
say
ビューの結果を いわゆる レイアウト に自動的に埋め込むからです。 レイアウトは、この場合、views/layouts/main.php
にあります。
上記の URL の r
パラメータについては、さらに説明が必要でしょう。
これは ルート、すなわち、アクションを指し示すアプリケーションを通じて一意な ID を表します。
ルートの書式は ControllerID/ActionID
です。
アプリケーションはリクエストを受け取ると、このパラメータ r
をチェックし、ControllerID
の部分を使って、このリクエストを処理するためにどのコントローラ・クラスのインスタンスを作成すべきかを決定します。
そして、コントローラは ActionID
の部分を使って、実際の仕事をするためにどのアクションを呼び出すべきかを決定します。
この例で言えば、site/say
というルートは、SiteController
コントローラ・クラスと say
アクションとして解決されます。
結果として、SiteController::actionSay()
メソッドがリクエストを処理するために呼び出されます。
Info: アクションと同じく、コントローラもまたアプリケーションの中で一意に定義される ID を持ちます。 コントローラ ID も、アクション ID と同じ命名規則を使います。 コントローラ・クラスの名前は、コントローラ ID からダッシュを削除し、各単語の最初の文字を大文字にし、 結果として出来る文字列に
Controller
という接尾辞を追加したものとなります。 例えば、post-comment
というコントローラ ID に対応するコントローラ・クラスの名前はPostCommentController
です。
まとめ ¶
このセクションでは、MVC アーキテクチャ・パターンのうちのコントローラとビューの部分に触れました。
特定のリクエストを処理するためのアクションをコントローラの一部として作成しました。また、レスポンスのコンテントを作成するためのビューも作成しました。
この単純な例においては、使用される唯一のデータが message
パラメータであったため、モデルは関係していません。
また、Yii におけるルートについても学びました。ルートはユーザのリクエストとコントローラのアクションとの橋渡しとして働くものです。
次のセクションでは、モデルを作成する方法を学びます。そして、HTML フォームを含むページを追加します。