概要
FuelPHPでユーザ登録をする画面にて、メールアドレスなどを入力するフォームを作成しています。
POSTされたメールアドレスがDBに登録済みでないか確認するため、Validation のルールを拡張します。Validation の拡張についてはドキュメントにサンプルが書かれています。
Validation – クラス – FuelPHP ドキュメント
しかし、作成した独自ルールを使うためのadd_callable
をどこで使えば良いのか悩みました。なんとかわかったので紹介します。
環境
FuelPHP 1.8.2
本記事での目標
本来やりたいのはメールアドレスが登録済みか否かの確認ですが、知りたいのはadd_callable
をどこで使うかです。DBを使うとややこしくなるので、もっとシンプルな例を考えたいです。
そこで、本記事では、フォームに入力された名前が「taro」か否かを検証する独自ルール(is_taro)を作ることにします。
独自ルール実装後の動作イメージ
実装後のイメージを示します。
NAMEに’taro’と入力して’confirm’を押すと、「Hi taro.」と表示(echo)されます。
一方、’taro’以外の文字を入力して’confirm’を押すと、「You are NOT taro.」と表示(echo)されます。
実装したコード
まず、独自ルールのクラスを作ります。
- APPPATH/classes/myrules.php
<?php class MyRules { //$valが文字'taro'ならtrue public static function _validation_is_taro($val) { return ($val === 'taro'); } }
次に、コントローラを用意します。
- APPPATH/classes/controller/taro.php
<?php class Controller_Taro extends Controller { public function action_index() { //FieldSetを作成 $fieldset = Fieldset::forge('confirm_form'); //フィールドを追加 $fieldset->add('username', 'NAME', array('type'=>'text')) ->add_rule('required') ->add_rule('is_taro'); //(※1)独自ルール'is_taro'を付与 $fieldset->add('submit', '', array('type'=>'submit', 'value'=>'confirm')); //POST送信された場合 if(Input::method() === 'POST'){ //Validationインスタンスを作成 $val = $fieldset->validation(); //(※2)独自ルールのバリデーションを実行する準備 $val->add_callable('MyRules'); //バリデーションを実行 if($val->run()){ echo 'Hi taro.'; }else{ echo 'You are NOT taro.'; } //POSTされた値を入力しておく $fieldset->repopulate(); } //FieldSetをFormに組み立ててビューを表示 $view = View::forge('taro'); $view->set_global('confirm_form', $fieldset->build(), false); return $view; } }
最後に、ビューを用意します。htmlやbodyタグなどは省略します。
- APPPATH/views/taro.php
<?php echo $confirm_form; ?>
要約
上記のコントローラにて、重要な2箇所に(※)書きをしました。
まず、フォームの要素はFieldSetインスタンスで作成しています。add_callable はValidationインスタンスに対するメソッドなので、FieldSetインスタンスには使えません。しかし、(※1)のように、ひとまず ‘is_taro’ というルールを add_rule で加えておくことはできました。’is_taro’というルールがあるかは、バリデーションのときに確認するということでしょう。
次に、POSTされた時は if 文の処理に入り、$fieldset->validation()
によってValidationインスタンス$val
を作ります。このValidationインスタンスに対して、add_callable メソッドを適用します(※2)。それから、$val->run()
にてバリデーションを実行しています。
おわりに
FieldSet と Validation のインスタンスが明確に区別できていなかったので苦労しました。インスタンスが区別できると、それぞれのクラスに適用できるメソッドも区別できるようになり、解決策を見出すことができました。
FuelPHPはドキュメント読めば大体わかるという意見も聞きますが、やはり慣れるまでは苦労しそうです。頑張ろ。