読者です 読者をやめる 読者になる 読者になる

letsspeak's diary

世界を大いに盛り上げるためのletsspeakの日記。

初心者がFuelPHPでValidationを使ってみた

FuelPHP

本来の順序通り行けばここでFormクラスを紹介するのが順当なのですが、Formクラスにあまりハマりどころが無くスムーズに進んでしまったので、今回はValidationクラスとView::set_globalの話を書きます。

Validationクラスとは、読んで字の如くFormから送信されたPOSTデータの正当性を確認するクラスで、フォームデータが空欄になっていないか、文字数制限をオーバーしていないか、といった条件をadd_rule()で簡単に指定でき、それぞれのエラーをはいてくれるとても便利なクラスです!

が、私のような初心者ともなれば、吐かれたエラーをどのようにすれば画面に表示できるのかですら右往左往してしまいました。エラーを表示するまでの流れで分かった事を簡単にまとめていきます。

 

Validationの実行部分

実行はわりと簡単で、下記サンプルコードのようにValidation::forge()を呼び出し、条件を追加したうえで、Validation::run()を実行するだけで終わります。

public function validate_addstory()
{
  $validation = Validation::forge();
  $validation->add('storytitle', '作品名')
      ->add_rule('required')
      ->add_rule('max_length', 32);
  $validation->add('kanatitle', '作品名(かな)')
      ->add_rule('required');
      
  $validation->run();
    
  return $validation;
}

 

エラー時の分岐処理

Validation::run()の後にValidation::error()を呼び出してエラーを配列に格納した上で、配列が空かどうかを調べれば良いようです。

$validation = $this->validate_addstory();
$errors = $validation->error();
      
if(empty($errors)){ // 正常時の処理 }else{ // エラー時の処理 }

 

エラー時の出力処理で右往左往

ここで私は右往左往しました。
Validation::show_errors()という素晴らしいメソッドが用意されており、初期状態で、

<ul><li>The field 作品名 is required and must contain a value.</li><li>The field 作品名(かな) is required and must contain a value.</li></ul>

 という風にリスト表示されるようになっているのですが、当初これをそのまま

$result_validate = $validation->show_errors();
$view->set_global('result_validate', $result_validate);

としてしまい、タグがエスケープされてしまっていました。

また別の表示方法としてcore/class/validation.phpを参考に、

$errors = $validation->error();
$view->set_global('errors', $errors);

 とした上でにviewから

<?php foreach ($errors as $err):?>
<p><?=$err->get_message()?></p>
<?php endforeach;?>

という風に呼び出した際には

ErrorException [ Error ]: Call to a member function get_message() on a non-object

とのエラーが発生してしまい、表示さえもままならない状態になってしまいました。

 

エラーを正しく表示する

さて、ここまで来ると初心者の私といえども薄々勘づいてきます。

View::set_global()が怪しい!怪しすぎる!というか黒だ!

公式ドキュメントを見直すと3つ目の引数 $encode に答えがありました。

$encode null set to true or false to encoding, defaults to main auto encoding setting

 訳:引数を省略した場合、trueにした場合はエンコードします。

上記の例ではいずれも省略していたので、タグをエンコードしてくれたり、Validation_Errorオブジェクトを他の何かに変更してくれたりしたみたいです。

それぞれ下記の修正で正常に動きました。

$view->set_global('errors', $errors, false);
$view->set_global('result_validate', $result_validate, false);

 

おまけ

ValidationクラスのConfigrationを設定しておくと、Validation::show_errors() から出力されるエラーの記法を変えられるようですので、<ul>などが邪魔な場合はこれを取っ払ってしまうというのも一つの手かもしれません。(Validation Class 公式ドキュメント参照)

が!ソースを見た限りエラーごとの改行がまったくされておらず汚いです・・・。
上記のように$errorsに格納してValidation_Errorオブジェクトの配列を丸ごと投げるのが、実は最も良いのかもしれないなーと思いました。