CodeIgniter3.0 のForm ValidationクラスでGETパラメータの扱い方が変わりました。

マークアップエンジニアの  です。

話題としてはちょっと遅いですが、PHP FWのCodeIgniter3.0についてのお話です。
癖のあるCIのForm_validationクラスのGETパラメータのバリデーションが変わりました。

f:id:nanndemoiikara:20150531071311j:plain



以前までの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クラスへの期待

  1. configにルールを記述する場合の_config_rulesメンバ変数に入るのは良いけどメモリ使うのでHMVC環境でないと怖くて使えない。
  2. resetメソッドでリセットできるのはいいけど、_config_rulesを消さないで欲しい。(引数にbooleanを入れる等して対応して欲しい。)


以上自宅からお送りしました。