日記
Zend Frameworkをどう使うか その18Edit

Zend_InputFilterは、Zend_Filterの機能を使って特定の入力(=連想配列)に対するフィルタリングを行うためのクラス。コンストラクタで入力値を渡し、以降はその入力値のキー名に対して、Zend_Filterと同名のメソッドをコールすると、フィルタリングやバリデーションを行うことができる。

具体的には、

$filteredPost = new Zend_InputFilter($_POST);
if (!$filteredPost->isAlpha('name')) {
// 不正な入力値によるエラー処理
} else {
$name = $filteredPost->getAlpha('name'); // if文でalphaであることは確定しているんで、実際にはgetRawでいいけど
}

なんて感じになるんだけど、内部的にZend_Filterを使っているんで、そっちの紹介の追記で解説したように、それらをまとめて、

$filteredPost = new Zend_InputFilter($_POST);
if (!$name = $filteredPost->isAlpha('name')) {
// 不正な入力値によるエラー処理
} else {
// $nameを使った処理
}

といった形で書くこともできる。慣れるまでは可読性が落ちる(is〜で実体が返るのかよ)んで、俺はあんまり好きじゃないけど。

ちなみにZend_InputFilterのコンストラクタの引数には、通常$_POSTみたいなスーパーグローバル変数にセットされた入力値を渡すわけだけど、恐ろしいことにこの引数に対して、デフォルトでは破壊的な操作が行われる。

$filteredPost = new Zend_InputFilter($_POST);

とやったら、ここで$_POSTはNULLにセットされてしまい、以降$_POST相当のデータには$filteredPostを通してしかアクセスできないようになる。

俺は、これってものすごく大きなお世話って気がするんだけど、どうなんだろう? ちなみに第2引数に、

$filteredPost = new Zend_InputFilter($_POST, false);

なんて感じでFALSEを指定してやると、元のスーパーグローバル変数(には限らないけど、第1引数として渡された変数)のリセットは行われない。デフォルトはこっちにしておいた方が良くないか?

ちなみに現状ではこのZend_InputFilterって、フレームワークの一部としてフレームワークの他のコードから利用されたりはしていないんだけど、Zend_Controller_Routerには、$_SERVERから直接REQUEST_URIを取得しているところに、

@todo Replace with Zend_Request object

なんてことが書かれている。ということは、もしかしたら、

class Zend_Request
{
var $_get = null;
/* snip */
public function __construct()
{
$this->_get = new Zend_InputFilter($_GET);
/* snip */
}
function GET()
{
return $this->_get;
}
/* snip */
}

なんてクラスが登場して、Controller配下からそのインスタンスにアクセスできるようになるんじゃなかろうか? ちなみに使い方としては、

$req = new Zend_Request();
$name = $req->GET()->getAlpha('name'); // $_GET['name']のアルファベット要素のみを取得

みたいなイメージね。

ただこうやっちゃうと、

  • デフォルトですべての入力値系スーパーグローバル変数をリセットしていいのか
  • 上記のようなオブジェクトは、さまざまな場所で利用することになるけど、そのアクセスインターフェースはどうする?(シングルトン?)

あたりが微妙なんで、まだ公開されていないとか?

Published At2006-03-27 00:00Updated At2006-03-27 00:00