クスリだけもらってきた
そろそろ花粉症のクスリが切れる頃なので、処方箋だけもらって3週間分クスリを追加。それにしても、この2、3日は花粉がひどいことになっているな。ちょっとクスリを飲む間隔が空くと、目鼻がひどいことになる。今週末は会社の花見なんだけど、そんなのにいっている場合なんだろうか?
そういや渋谷の桜はもうほとんど満開だね。通りすがりに、桜ヶ丘の坂の写真を撮ってきたけど、なんかひどい写りだ。これじゃ全然桜がきれいに見えないね。木の下から上に向かって撮れば、もうちょっときれいに取れただろうに。携帯の画面だと逆光かどうかの判断がいまいちわからないんだよな。
Zend Frameworkをどう使うか その18
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']のアルファベット要素のみを取得
みたいなイメージね。
ただこうやっちゃうと、
- デフォルトですべての入力値系スーパーグローバル変数をリセットしていいのか
- 上記のようなオブジェクトは、さまざまな場所で利用することになるけど、そのアクセスインターフェースはどうする?(シングルトン?)
あたりが微妙なんで、まだ公開されていないとか?
