「Hello World!」アプリケーションの作成(作成)
ファイル作成
実際にMVCを用いたごく簡単なアプリケーションを作成していきましょう。フォームから名前を入力すると「~さん、こんにちは!」と返すというものです。
フロントコントローラ「index.php」
公開フォルダに置かれるフロントコントローラの役割を担う「index.php」には、以下のような記述をします。
<?php require_once 'Zend/Controller/Front.php'; Zend_Controller_Front::run('../zendapps/controllers');
2行目で、フロントコントローラ用のコンポーネントZend/Controller/Front.phpを呼び出しています。すべてのリクエストはフロントコントローラがまず受けつけ、その内容によってフロントコントローラが該当するアクションコントローラとアクションに処理を受け渡します(ディスパッチ)。3行目では、フロントコントローラのインスタンスの取得/コントローラのフォルダ指定('../zendapps/controllers')/ディスパッチを一気に行っています。
デフォルトでは「ErrorHandler」プラグインと「ViewRenderer」アクションヘルパーが有効になっており、ビューやエラーの処理が簡潔に行えるようになっています。これらは必要に応じて以下のような記述をディスパッチ処理の前(上記では3行目の前)に加えることで無効にすることができます。これらプラグインとアクションヘルパーについては、次回以降解説する予定です。
<?php
Zend_Controller_Front::getInstance()->setParam('noErrorHandler', true);
<?php
Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);
また上記でも用いていますが、setParam($name, $value)
では、フロントコントローラに任意のパラメータをセットすることもできます。パラメータはルーティング/ディスパッチ/アクションコントローラの過程を通して使うことができます。以下にメソッドをまとめておきます。
メソッド | 内容 |
setParam($name, $value) | パラメータ$nameの値を$valueに設定する |
getParam($name) | パラメータ$nameの値を得る |
setParams(array $params) | 連想配列$paramsにより複数のパラメータを設定する |
getParams() | すべてのパラメータの一覧を得る |
clearParams($name) | $nameを消去する |
アクションコントローラ「IndexController.php」
フロントコントローラから、リクエストに従ってコントローラフォルダの該当するアクションコントローラファイルが呼び出されます。
アクションコントローラファイルの各要素と命名規則
アクションコントローラファイルの中には、さらに個々の処理単位である「アクション」メソッドが記述されています。アクションコントローラファイル/クラス/アクションメソッドの各々には以下のような命名規則があります。
要素 | 命名規則 |
ファイル名 | <コントローラ名(最初のみ大文字)>Controller.php |
クラス名 | <コントローラ名(最初のみ大文字)>Controller |
アクションメソッド名 | <アクション名(すべて小文字)>Action |
呼び出し時のURLパターン
以下は、特定のコントローラとアクションを呼び出すためのデフォルトのURL表記です。
http://mywebsite/<コントローラ名>/<アクション名>/<パラメータ1> /<パラメータ1の値>/<パラメータ2>/<パラメータ2の値>/…
例えば
http://mywebsite/bbs/edit/id/2
は、bbsコントローラのeditアクションに「id=2」でアクセスします。
「Hello World!」アプリケーションにおけるリクエスト処理と各要素間の関係
上記命名規則とURLパターンを踏まえて、各要素間の関係を見てみましょう。下図のようになっています。
- ブラウザから送られたリクエストをフロントコントローラ「index.php」が受け取る
- 対応するアクションコントローラ「IndexController.php」に以後の処理が引き渡される(ディスパッチ)
- 「IndexController.php」中のアクションである「indexAction()」「helloAction()」は呼び出されるとそれぞれ対応するビューとなるファイル「index.phtml」「hello.phtml」に表示を依頼
- これら一連の処理の結果がレスポンスとしてフロントコントローラに取得される
- ブラウザに4の内容が送られる
アクション「index」と「hello」はそれぞれフォーム画面と「こんにちは!」を返す画面に対応しています。最初のリクエスト(フォームを表示する)に際してはまず「index」アクションへディスパッチがなされ、ここで名前が入力され、送信されることで名前を処理するための「hello」アクションへのディスパッチがなされます。
「IndexController.php」ファイルの作成
ここから実際のアクションコントローラファイルの内容について、説明していきます。
こちらはデフォルトのアクションコントローラの例です。
<?php require_once 'Zend/Controller/Action.php'; //コンポーネントの呼び出し class IndexController extends Zend_Controller_Action { public function indexAction() //デフォルトのアクションメソッド { } }
デフォルト名はコントローラが「Index」、アクションが「index」です。呼び出し時にコントローラやアクションの指定がない場合に、これらが呼び出されます。
そして、今回は次のようにしました。
<?php require_once 'Zend/Controller/Action.php'; class IndexController extends Zend_Controller_Action { public function indexAction() { } //不要な場合は、メソッドの中は空でも構いません public function helloAction() //helloアクションメソッド { $req = $this->getRequest(); $this->view->assign('name', $req->getPost('yourname')); } }
アクションメソッドhelloAction()
で使われているメソッドを表に示します。
メソッド | 内容 |
$this->view->assign('name',$value) | $nameに$valueを代入してビューで使えるようにする |
getRequest() | リクエストオブジェクトを取得する |
getPost('yourname') | フォームから受け取った「yourname」パラメータ($_POST)を取得する |
helloAction()
メソッド内の$this->view->assign('name', $req->getPost('yourname'));
では、フォームから受け取った「yourname」パラメータを取得して、name
という変数に代入し、helloアクションに対応するビューで使えるようにしています(ビュースクリプト内で$this->name
として使えます)。
getRequest()
で取得される「リクエストオブジェクト」は、リクエスト処理の一連の流れの中でやりとりされるもので、コントローラ/アクション/その他パラメータの内容が中にまとまっています。具体的には、ルーティングの過程で、送られてきたリクエストの処理に該当するコントローラ/アクション/リクエストパラメータがリクエストオブジェクトに設定されます。それがディスパッチの過程でリクエストオブジェクトから取り出され、実際のコントローラとアクションメソッドに対応が行われ、受渡されることになります。
上記ではgetPost()
によりスーパーグローバル変数の内容にアクセスしましたが、それもリクエストオブジェクトを通して取得しています。その他、Zend Frameworkではスーパーグローバル変数の内容を取得するためのメソッドが以下のように用意されています。
メソッド | 取得されるスーパーグローバル変数 |
getQuery() | $_GET |
getPost() | $_POST |
getCookie() | $_COOKIE |
getServer() | $_SERVER |
getEnv() | $_ENV |
ビューの作成
コントローラ/アクションごとに、対応するビューである「views/scripts/<コントローラ名>/<アクション名>.phtml」というファイルを作成します。今回はIndexコントローラ内の2つのアクション、indexとhelloについてそれぞれビューを作成します。
indexアクションのビューでは、名前を入力するフォームを作成します。
<html> <head> <title>Hello World!</title> </head> <body> こんにちは!<br /> お名前をどうぞ。<br /> <form action="Index/hello" method="post"> <?php echo $this->formText('yourname','your name')?> <?php echo $this->formSubmit('','Go')?> </form> </body> </html>
ここではZend Frameworkで用意されている「ビューヘルパー」という、複雑になりがちなHTML記述を簡単に記述できる関数を利用します。これらは自動的に適切なエスケープ処理も行ってくれます。 以下に、ビューヘルパーをいくつか挙げておきます。
ビューヘルパー | 作成される要素 |
formFile($name, $value, $attribs) | <input type="file" /> |
formSubmit($name, $value, $attribs) | <input type="submit" /> |
formText($name, $value, $attribs) | <input type="text" /> |
helloアクションのビューでは、helloアクションから受け取った$name
を使い、「こんにちは、~さん!」と表示します。
<html>
<head>
<title>Hello World!</title>
</head>
<body>
こんにちは、
<?php echo $this->escape($this->name);?>
さん!
<br />
</body>
</html>
8行目の$this->escape($this->name)
では、$this->name
のエスケープ処理を行っています。具体的にはhtmlspecialchars()
関数と同様の処理を行っていますが、カスタマイズすることも可能です(後の回で解説する予定です)。
ここまでで、「Hello World!」アプリケーションが完成しました。
http://localhost/
にアクセスしてみてください。
今回のまとめ
今回は、Zend FrameworkのMVCを活用して「Hello World!」アプリケーションを作ってみました。ごく簡単ではありますが、Zend Frameworkを使ったアプリケーション作成の雰囲気がつかめたのではないでしょうか。
次回はZend Frameworkの中核とも言えるZend_Controllerについて、もう少し詳しく解説していきたいと思います。