こんにちは、と言う

このセクションでは、アプリケーションに「こんにちは」という新しいページを作成する方法を説明します。 この目的を達するために、アクションビュー を作成します。

  • アプリケーションは、このページへのリクエストをそのアクションに送付します。
  • 次にそのアクションが「こんにちは」という言葉をエンド・ユーザに示すビューを表示します。

このチュートリアルを通じて、三つのことを学びます。

  1. リクエストに応える アクション を作成する方法
  2. レスポンスのコンテントを作成する ビュー を作成する方法
  3. アプリケーションがリクエストを アクション に送付する仕組み

アクションを作成する

「こんにちは」のタスクのために、リクエストから 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

Hello World

この URL は、結果として、"Hello World" を表示するページになります。このページはアプリケーションの他のページと同じヘッダとフッタを共有しています。

URL から message パラメータを省略すると、"こんにちは" を表示するページを見ることになるでしょう。 これは、messageactionSay() メソッドにパラメータとして渡されるものであり、それが省略された場合には、デフォルト値である "こんにちは" が代りに使われるからです。

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 フォームを含むページを追加します。