生活の跡

個人的な備忘録

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