FuelPHP で拡張した Validation のルールを適用したフォームを作成する

概要

FuelPHPでユーザ登録をする画面にて、メールアドレスなどを入力するフォームを作成しています。
POSTされたメールアドレスがDBに登録済みでないか確認するため、Validation のルールを拡張します。Validation の拡張についてはドキュメントにサンプルが書かれています。

Validation – クラス – FuelPHP ドキュメント

しかし、作成した独自ルールを使うためのadd_callableをどこで使えば良いのか悩みました。なんとかわかったので紹介します。

環境

FuelPHP 1.8.2

本記事での目標

本来やりたいのはメールアドレスが登録済みか否かの確認ですが、知りたいのはadd_callableをどこで使うかです。DBを使うとややこしくなるので、もっとシンプルな例を考えたいです。
そこで、本記事では、フォームに入力された名前が「taro」か否かを検証する独自ルール(is_taro)を作ることにします。

独自ルール実装後の動作イメージ

実装後のイメージを示します。

f:id:ishii-akihiro:20191023001126p:plain

NAMEに’taro’と入力して’confirm’を押すと、「Hi taro.」と表示(echo)されます。

f:id:ishii-akihiro:20191023001326p:plain

一方、’taro’以外の文字を入力して’confirm’を押すと、「You are NOT taro.」と表示(echo)されます。

f:id:ishii-akihiro:20191023001425p:plain

実装したコード

まず、独自ルールのクラスを作ります。

  • 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はドキュメント読めば大体わかるという意見も聞きますが、やはり慣れるまでは苦労しそうです。頑張ろ。

タイトルとURLをコピーしました