CodeIgniter3.0 のForm ValidationクラスでGETパラメータの扱い方が変わりました。
マークアップエンジニアの です。
話題としてはちょっと遅いですが、PHP FWのCodeIgniter3.0についてのお話です。
癖のあるCIのForm_validationクラスのGETパラメータのバリデーションが変わりました。
以前までのForm_Validation
このForm_validationクラスですが、2.xの頃までGETパラメータについてはvalidationをかける事ができませんでした。
なので
<?php $_POST['foo'] = $_GET['foo']; $this->form_validation->set_rules('foo', 'required'); if ( $this->form_validation->run() === FALSE ) echo 'ひっかかったよ!';
とか
<?php $foo = $this->input->get('foo'); if ( $this->form_validation->required($foo) === FALSE ) echo 'ひっかかったよ!';
こんな感じで
$_POSTにデータを入れるかform_validation内のルール用のメソッドを使用して検証していました。
((CI2.xのvalidation例:後者の方法はCI3.0でも動きます。)
後者は美しいですが複数ルールを書く時にめんどくさいので、前者がCI使っている人たちの中ではポピュラーな実装だったのではないでしょうか?
なんとCI 3.0になりGETパラメータをわざわざスーパーグローバル変数の_POSTに代入するなんて気持ち悪い実装をする必要が無くなりました。
ではCodeIgniter3.0ではどう実装するの?
<?php $this->form_validation->set_data($_GET); $this->form_validation->set_rules('foo', 'required'); if ( $this->form_validation->run() === FALSE ) { echo 'ひっかかったよ!'; }
こんな感じか
<?php $this->form_validation->validation_data = $_GET; $this->form_validation->set_rules('foo', 'required'); if ( $this->form_validation->run() === FALSE ) { echo 'ひっかかったよ!'; }
こんな感じでpublicなメンバ変数validation_dataに代入する事でvalidationができちゃいます。
両者とも内部的にはやっている事は変わりませんが、せっかくメソッドが用意されているので
おそらく前者のset_dataメソッドを使った方が良いと思います。
また、3.0からは$_POSTに代入しても内部的にリクエストメソッドがPOSTか検証して_POSTの値を取ってきているのでForm_validationはできなくなっています。
個人的にCI 3.0以上でのForm_validationクラスへの期待
- configにルールを記述する場合の_config_rulesメンバ変数に入るのは良いけどメモリ使うのでHMVC環境でないと怖くて使えない。
- resetメソッドでリセットできるのはいいけど、_config_rulesを消さないで欲しい。(引数にbooleanを入れる等して対応して欲しい。)
以上自宅からお送りしました。