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

そろそろ本格的に、いわゆるフレームワークとは関係ない、ただのライブラリしか残っていないなー。あとはせいぜいフィルター周りが、ちょっとはフレームワークの一部っぽいか?

入力フィルターの機能を受け持っているのは、汎用フィルター関数群のZend_Filterと、それを使って実際の入力値をフィルタリングするZend_InputFilterの二つ。

Zend_Filterはクラスとして宣言されているけど、public static functionしかないんで、実質は名前空間の代わりだね。で、持っている機能としては、

  • Zend_Filter::getAlpha($value) - アルファベット以外の文字を除去して返す。01ab!#23cd → abcd。
  • Zend_Filter::getAlnum($value) - アルファベットと数字以外の文字を除去して返す。01ab!#23cd → 01ab23cd。
  • Zend_Filter::getDigit($value) - 数字以外の文字を除去して返す。01ab!#23cd → 0123。

みたいな感じで、元となる文字列から、指定した文字要素以外を除去した文字列を取得するパターンのものがいくつか。

  • Zend_Filter::getDir($value) - パスからディレクトリ部分のみを抽出する。っつーか単にbasedir関数。
  • Zend_Filter::getInt($value) - intにキャストして返す。
  • Zend_Filter::getLength($value, $length = NULL) - 最初のn文字を返す。
  • Zend_Filter::getPath($value) - 相対パスを絶対パスに変換する。っつーか単にrealpath関数。
  • Zend_Filter::noTags($value) - HTMLタグ除去。striptags。
  • Zend_Filter::noPath($value) - パスからディレクトリ部分を除去。basename。

みたいな文字列変換系のもの。

  • Zend_Filter::isAlpha($value) - アルファベットのみで構成されているかどうかを返す。

みたいなある表現形式に合致しているかどうかを返すもの(このパターンはたくさんあるんでいちいち列挙しない)がある。

うーん、このクラス(ライブラリ)はなんかビミョーな出来だなー。

AlphaやAlphaNum、Digitあたりに関する関数は、まあ汎用性があるからこういう形で持っていてもいいだろう。でもパス操作なんて、別にPHPの関数そのまま使えばいいじゃん。Zend_Filterって殻にかぶせた方が使いやすくなっているとは思えない。

ましてや、isDateとかisPhoneとかisZipとか中途半端に特定の(地域の)パターンに対応した関数をフレームワークの標準機能の一つとして持っていられても、いまいち使えない気がする。たとえばisPhoneなんて、アメリカの地域コード一覧とか直値で持っていたりして、その辺のチェックまで行っているけど、これってどうよ?

一応アメリカ以外の国のデータも、持とうと思えばもてるようになっているから、将来的には少なくとも数カ国分のパターンは入れるつもりなんだろうけど、でもこういうアプローチじゃ完全な国際化対応はできないよなー。こういう微妙な機能はもっと根本的にプラガブルに設計するか、じゃなかったら標準では取り込まない方がいい気がするなー*1

と、長くなってきたのでここでいったん終了。Zend_InputFilterについては後で。

訂正

Zend_Filter::isAlpha($value) - アルファベットのみで構成されているかどうかを返す。

みたいなある表現形式に合致しているかどうかを返すもの(このパターンはたくさんあるんでいちいち列挙しない)がある。

と書いたけど、この手のis〜系の関数はbool値を返す一般的なValidate関数ではなかった。Validateに失敗した場合はfalseを返すけど、Validateに成功した場合は、引数として渡された$valueの内容をそのまま返す。

つまり、

if ($value = Zend_Filter::isAlpha($value)) {
// $valueには元の$valueが入っているので
// そのまま$valueを使った処理を書ける
} else {
// $valueにはFALSEが返されている
}

なんて書き方ができるっつーのが、このZend_Filter(およびZend_InputFilter)の工夫らしい。

Zend_Filterだとこの工夫にはあまり意味がないけど、Zend_InputFilterでこの表現を使うとコードが1行省略できる(Validate行とFilterされた値を取得する行を2行に分ける必要がない)んで便利でしょ、ってことらしい。

でも俺的には、この手の基本的なロジックは、変に工夫して行数を削減するよりも、読んでわかりやすい方がいい気がするんだけどね。

*1 ってのは、HTML_QuickFormのDate周りとかを見たときにも思ったし、あれを汎用的に日本語対応するのは結構苦労した

Published At2006-03-26 00:00Updated At2006-03-26 00:00