ZendFramework入門・その3 フォームを取り扱う・その12007年09月09日 04時21分20秒

ちょっと予定を変更

前回の終わりに書いた予告では、「複数のアクションコントローラを使用する例」をやるつもりだったのですが、よく考えてみたらこれって特に技術的に注意点があるわけじゃないので今回は見送ることにしました。

その代わり、でもないんですが、今回はフォームを触ってみることにします。

フォルダツリーの構築

今回はまた新しいアプリケーションということにします。名前は「zf2」にしておきましょう。

お決まりのように、まずは以下のフォルダ構成を作ってください。

  • htdocs/
    • zf2/
      • application/
        • controllers/
          • IndexController.php
        • views/
          • scripts/
            • index/
              • index.phtml
              • dump.phtml
      • index.php
      • .htaccess
index.php は前回のものをそのまま流用してください。

IIS + ISAPI-Rewriteの環境の方は、httpd.iniにzf2向けの設定を追加することを忘れないでください。以下のようになります。

RewriteRule ^/zf2/[\w/\%]*(?:\.(?!(?:js|ico|gif|jpg|png|css)$)[\w\%]*$)? /zf2/index.php [I]

まずは、以下のようなきわめてシンプルな形で作成してみます。

  • 入力フォームを表示するアクション(→ indexAction)
  • indexActionの送信ターゲットで、入力フォームの内容をダンプするアクション(→ dumpAction
ということで、application以下には「IndexController.php」と「index.phtml」「dump.phtml」を作成することになります。

IndexController - 入力フォームの作成

さっそくIndexController.phpを作成してみましょう。まずはindexActionのみの実装です。

<?php
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action {
	// 初期化処理
	public function init() {
		// BASE要素向けのベースURL
		$this->view->assign( 'baseUrl', getApplicationUrl( $this->getRequest() ) );
	}
	
	// indexアクション
	public function indexAction() {
	}
}
IndexController.php
...はい、indexActionでは特にすることがありません(^^;

対応するindex.phtmlです。これまたなんのひねりもありませんね。

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
    <base href="<?php echo $this->baseUrl; ?>/"></base>
    <title>フォーム テスト</title>
  </head>
  <body>
    <h3>入力フォーム</h3>
    <form action="index/dump" method="post">
      <ul>
        <li>
          <label for="name">名前</label>
          <input type="text" name="name" id="name" size="20">
        
        <li>
          <label for="sex">性別</label>
          <select name="sex" id="sex">
            <option value="1">男性
            <option value="2">女性
          </select>
      </ul>
      <input type="submit" value="送信">
    </form>
  </body>
</html>
index.phtml
なんてことはない、dumpActionに向けてnameとsexというフィールドをpostするだけです。

フォームの入力内容を受け取る

あたりまえなのですが、indexActionから送信されたを受け取る必要があります。$_GETや$_POSTなどのスーパーグローバルを使ってはいけないということはないのですが、Zend Frameworkで用意されている機能を使うようにしましょう。

勘の良い方は、前回index.phpに追加した「getApplicationUrl」のコードからピンとくるかも知れませんが、Zend Framework(というよりZend_Controllerか)でリクエスト情報にアクセスするにはZend_Controller_Requestを使用します。

Zend_Controller_Requestの細かい説明は後回しにして、とりあえず入力内容を受け取って表示するだけのdumbActionを実装してみましょう。以下のような感じです。

<?php
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action {
	// 初期化処理
	public function init() {
		// BASE要素向けのベースURL
		$this->view->assign(
			'baseUrl',
			getApplicationUrl( $this->getRequest() )
		);
	}
	
	// indexアクション
	public function indexAction() {
	}
	
	// dumpアクション
	public function dumpAction() {
		$this->view->assign(
			'postData',
			$this->getRequest()->getParams()
		);
	}
}
「dumpAction」を追加したIndexController.php

そして、対応するdump.phtmlは以下のような感じです。

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <base href="<?php echo $this->baseUrl; ?>/"></base>
    <title>フォーム テスト - 送信内容</title>
    <style>
    .dump {
      border: solid 2px silver;
      overflow: auto;
      height: 250px;
    }
    </style>
  </head>
  <body>
    <h3>送信内容</h3>
    <pre class="dump"><?php var_dump( $this->postData ); ?></pre>
    <hr>
    <a href="index/index">戻る</a>
  </body>
</html>
dump.phtml

実行結果と解説

ここまでのコードを実行してみましょう。まずは「http://<host名>/zf2/」にアクセスすると、以下のようなフォームが表示されます。

入力フォーム

index/index
名前に「dara-j」、性別を「男性」にして送信すると、index/dumpで以下のように表示されます。

送信内容

array(5) {
  ["controller"]=>
  string(5) "index"
  ["action"]=>
  string(4) "dump"
  ["module"]=>
  string(7) "default"
  ["name"]=>
  string(6) "dara-j"
  ["sex"]=>
  string(1) "1"
}

戻る
index/dump

さて、dumpActionとdump.phtmlの解説です。 まず、dumpAction内の「$this->getRequest()->getParams()」ですが、「$this->getRequest()」でリクエストオブジェクトであるZend_Controller_Request_Httpのインスタンスを取得します。getApplicationUrlに渡している部分と同じですね。 そして、取得したリクエストオブジェクトの「getParams()」メソッドを実行した結果を'postData'としてviewにassignしています。

Zend_Controller_RequestのgetParamsメソッドは、getパラメータやpostパラメータなどの、クライアントから要求されたパラメータすべてを格納した連想配列を取得するメソッドです。(※ 実際にはsetParam/setParamsによって、コントローラ処理中に任意に設定されたパラメータも含まれますが、ここではそういった使い方には触れていません)

そして、dump.phtmlでは、'postData'としてassignされた連想配列をダンプしています。

getParams()の中身とその他のアクセスメソッド

出力された連想配列をみて「あれ?」と思いませんでしたか?キー「controller」が「index」、「action」が「dump」...そうです。どのコントローラのどのアクションが指定されたか、の情報もリクエストオブジェクトに含まれるのです。

ここではgetParams()でいっさいがっさいを取得しましたが、リクエストオブジェクトに対してgetControllerName()やgetActionName()といったメソッドでこれらの情報を取得することもできます。

リクエストオブジェクトZend_Controller_Request_Httpの主なアクセスメソッドには以下のようなものがあります。

  • mixed getParams() → ユーザパラメータやGETパラメータ、POSTパラメータを格納した連想配列を取得する
  • mixed getParam(string $key, [mixed $default=null]) → キー$keyに関連付けられたパラメータ値を取得する。$defaultを指定した場合、$keyが指定されていない場合のデフォルト値にできる
  • mixed getPost([string $key=null], [mixed $default=null]) → POSTパラメータを取得する。$keyを指定した場合は$keyに対応する値のみ、省略した場合は$_POSTそのものが返る。$defaultはgetParam()と同じ。
  • mixed getQuery([string $key=null], [mixed $default=null]) → getPost()のGET版
その他のメソッドやメンバはAPIリファレンスで調べてみてください。

今回のまとめ

今回のポイントは以下のとおりです。

  • フォームの入力値を取得するには、Zend_Controller_Request_Httpを使用して、getParams()メソッドを使用する
  • getParams()で取得できる連想配列にはコントローラやアクションの情報も含まれる
  • Zend_Controller_Request_Httpには、他にもgetParam()、getPost()などの情報へのアクセスメソッドがある
まとめてみると、また薄い内容でしたね...

今回の反省&次回予告

本当はこのあとに「受け取った入力値をもう一度フォームにまわす」ようなサンプルを載せるつもりだったのですが、思ったより記事が長くなったので今回はここまでにしました。単純に受け取った値をフォームに当てはめて表示させるだけなら今回の記事から簡単に作れるでしょうから、皆さん試してみてください。

さて、次回は今回のフォーム入力をベースに、他のアクションへ処理を委譲する方法とマジックメソッド、関連して(ようやく)基本的な例外処理方法について書こうと考えていますのでお楽しみに。