リクエストに対するフィルター・バリデーションについて
リクエストに対するフィルタやバリデーションを実施するのに、たとえばZend_Formを使っている分にはZend_Formに設定するフィルタやバリデーションを使えるからよいのですが、それ以外のデータについてはどうでしょうか。
Zend Frameworkでは、リクエストのバリデーションはルーターやディスパッチャで行うのが標準のようなのです。
http://framework.zend.com/manual/ja/zend.controller.request.html#zend.controller.request.http.dataacessGET および POST データ
リクエストオブジェクトのデータを扱う際には注意しましょう。 これらのデータは、一切フィルタリングを行っていません。 ルータやディスパッチャのほうで適切な検証とフィルタリングを行うので、 リクエストオブジェクト内のデータはそのままにしておきましょう。
ルーターにルートを設定するときに、必須条件とかフィルターとかいろいろ設定できるのでそこで処理しろっていうことだと思います。もちろんそれもいいと思います。
Zend_Filter_Inputは素敵
入力情報を一括処理するにはZend_Filter_Inputを使うのが設定を集約できて楽です。入力情報を扱うための機能としてはかなり集約されているので、Zend_FormやZend_Controller_RequestでもZend_Filter_Inputを内部に持たせればいいと思うのですが。コンポーネント間の依存が増えるわけですが、車輪の再発明をしてまで疎結合にする必要はないような気がします。
個人的にはZend_Filter_Inputに軍配を上げたいのですが、Zend_Formが主流になっていくと、この先の情勢はわからないですね。
アクションコントローラでのリクエスト情報の取得
リクエストパラメータ: リクエストオブジェクトは、_GET や _POST のようなリクエストパラメータのほかに URL のパスで指定したパラメータも収集します。 これらを取得するには、_getParam($key) あるいは _getAllParams() を使用します。 _setParam() を使用して、リクエストパラメータを設定することもできます。 これは、さらに別のアクションに転送する際などに有用です。
http://framework.zend.com/manual/ja/zend.controller.action.html#zend.controller.action.accessors
アクションコントローラーでリクエストにアクセスするには、_getParam等のメソッドを使います。_getParamはfinalメソッドになっています。もう一つの方法は、getRequest()でリクエストオブジェクトに直接アクセスできます。
逆に言うと、アクションコントローラーまで来てしまうと、各入力項目に一括網掛けというわけにはいかなくなるようです。ところが、どのデータをどのように信頼するかは、ルーティングレベルで決められることではないと思うのです。実際、デフォルトのルーターを残しておくと、ノンフィルターでデータが入ってきてしまいます。また、フィルタールールはアクションコントローラーで指定されることもあれば、モデルで指定されることもあると思います。
かといってリクエスト由来のデータへのアクセス方法が分散している状況でノンフィルターがデフォルトになってしまうのもちょっと気持ち悪い気もします。*1
リクエストオブジェクトにZend_Filter_Inputを内臓してみるテスト
ルーターはルーティング、ディスパッチャはディスパッチがお仕事なので。リクエストフィルタはリクエストオブジェクトの仕事にしてみたいという・・・そういう思いつきなのですが、リクエストオブジェクトを拡張して、Zend_Filter_Inputを内蔵させた例がないか、ちょっとググってみようかな。
*1:要するに自分を信用してないんですけど