FuelPHP の Validation を読んでみた
最近 業務で PHP を使うことになったので、趣味で FuelPHP を使い始めました。その中で FuelPHP の Validation を使おうと思うのに腰が重かったので、使う前に実装を読んでみようと思いたち、フォーム の Validation 部分の実装を読んでみました。
ただ、FuelPHP は core の開発が最近あまり進んでいなさそうなのが何とかならないですかね。。。
※ 趣味で読んでいる Mocha が難しすぎて、少し気休めが欲しかったのもありますが...
FuelPHP の Validation とは?
FuelPHP の Validation とは、フォーム を使う時に、フォーム の内容が正しいかをチェックする機能で、下のような ファイルで書きます(こちらのサイトから借りてきました)。
<?php
class Controller_Validation extends Controller
{
public function action_index()
{
$form = Fieldset::forge();
$form->add('name', 'Name')->add_rule('required');
$form->add('age', 'Age')
->add_rule('required')
->add_rule('numeric_between',0,200);
$form->add('submit', '', array('type'=>'submit', 'value'=>'Submit'));
if (Input::method() === 'POST') {
$val = $form->validation();
if ($val->run()) {
print "入力を受付けました";
} else {
print "不正な入力です";
}
$form->repopulate();
}
$view = View::forge('index/get');
$view->set_safe('form', $form->build('/validation/'));
return $view;
}
}
コードの上の方の $form = Fieldset::forge()
からの6行は フォームの定義を、コードの真ん中の方の if (Input::method() === 'POST') {
からの 9行は フォームのバリデーションを行っています。下の方で、$form->build
しているので、フォームの入力画面と更新が1つになった画面になっています。
コード自体はそんなには難しくないと思います。
では、中身はどうなっているのでしょうか?見てみましょう。
読む順番
今回、コードを読む順番としては、まず
$form = Fieldset::forge();
の Fieldset
の初期化の部分から始め、次に、
$form->add('name', 'Name')->add_rule('required');
の add
と add_rule
を見ていって、次に、
$val = $form->validation();
と
$val->run()
の 'validation()' と run()
を見ていきたいと思います。
FuelPHP Validation を読んでみる
Fieldset の初期化
初期化のコードはこちらにあります。ここ単体でやっていることは、new static
で自身の __construct
を呼び出し、それを instances の配列に入れているだけです。実体は、__construct
の初期化の部分(コードはここ)にありますが、その中の
$this->validation($config['validation_instance']);
で、バリデーションの初期化を、
$this->form($config['form_instance']);
でフォームの初期化を行っています。
内容が気になったら、中身を見てみるのもいいでしょう。今回は少しはしょって、次に行きます。
add と add_rule
add の実装は結構簡単で、普段は string しか渡されないので、主に
$this->fields[$name] = new \Fieldset_Field($name, $label, $attributes, $rules, $this);
の部分のみを行っています。
この $this->fields[$name]
が最後の return になっているので、この \Fieldset_Field
だけを見れば大丈夫そうですね。
この Fieldset_Field
はここにあって、その中に add_rule があります(コードだとここ)。add_rule の内容は
$this->rules[] = array($callback, $args);
で、配列に追加しているだけなのが分かりますね。
次に、validation を読んでいきます。
$form->validation() と validation->run()
validation は 前にも少し出ましたが、ここに実装があって 初期化では \Validation::forge($this)
しているのが分かります(コードはここ)。
この forge も __construct を呼び出している形になっていますが、この __construct も 再度 $fieldset->validation($this);
を呼び出しているくらいの簡単な処理になりますね。
次に、validation->run()
を読んでみます。
詳細ははしょりますが、まずは ここ で 先ほどの add
で出てきた fields
を for文で回します。
次に ここ の $this->input($name);
で Input::param
の内容を取得します(また、run の最初の部分で Input::method
が POST
か判定もしている )。
次に ここ で 先ほどの add_rule
した内容を for文で回し、_run_rule
します。
この _run_rule では、最初の find_rule で rule (add_ruleの第一引数が入っている。required や numeric_between など...) を _validation_
が先頭についた形にして、それを call_fuel_func_array
(詳細はこちら。基本は call_user_func_array と同じ) で呼び出しています。
この call_fuel_func_array の結果の $output で
throw new \Validation_Error($field, $value, $rule, $params);
しているのが分かると思います。
この結果が、catch され 最終的に空であるかが返されています。
最後に
FuelPHP も一部の機能だけなら、意外と簡単に読めました。
Laravel を使う可能性もあるんですが、FuelPHP を使い続けるなら、もう少しコードを読んでみたいと思います。