FuelPHPでバリデーションを使う方法を値入力からエラーメッセージ表示までをまとめてみました。
FuelPHPでバリデーションを使い、エラーメッセージを表示させる
バリデーションの引っかかった場合に、エラーメッセージを表示させます。エラーメッセージが複数ある場合を考慮し、implode()で配列要素を文字列として表示させています。
・edit.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ... <?php if (Session::get_flash('errors')): ?> <div class="alert alert-danger"> <p class="errorTxt"> <?php echo implode('</p><p class="errorTxt">', e((array) Session::get_flash('errors'))); ?> </p> </div> <?php endif; ?> ... <?= Form::open('action' => '/user/update/' . $user->id, 'method' => 'post']);?> <ul> <li> <dl> <dt>氏名</dt> <dd> <?php echo Form::input('name', Input::post('name', isset($user->name) ? $user->name : ''), ['placeholder'=>'氏名']); ?> </dd> </dl> </li> <li> <dl> <dt>メールアドレス</dt> <dd> <?php echo Form::input('email', Input::post('email', isset($user->email) ? \Crypt::decode($user->email) : ''), ['placeholder'=>'メールアドレス']); ?> </dd> </dl> </li> <li> <dl> <dt>電話番号</dt> <dd> <?php echo Form::input('phone_number', Input::post('phone_number', isset($user->phone_number) ? $user->phone_number : ''), ['placeholder'=>'電話番号']); ?> </dd> </dl> </li> </ul> ... <p class="btn"> <input type="submit" value="登録する" class="main" onClick="return confirm('登録します。よろしいですか?');"> </p> <?= Form::close(); ?> |
バリデーションの処理は以下のように実装しました。
バリデーションを実行するメソッドを呼び出し、引っかかった場合はエラーメッセージと共にViewにリダイレクトします。すると、先ほどViewで書いたif (Session::get_flash(‘error’))がtrueになるのでバリデーションのエラーメッセージが表示されます。
例えば、氏名を空で送信すると、「氏名は必須入力です。」のようなエラーメッセージが表示されます。
バリデートに成功した場合は、try・catch内でトランザクションを張って更新処理を実装するような形になります。
バリデーションのルールは公式リファレンスに詳しく書いてあります。
Validation - クラス - FuelPHP ドキュメント
fuelphp.jp
・users.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | ... private $validator; /** * 更新処理 * @param int $id */ public function post_update(int $id) { // Viewから送られてきた入力値を取得する(今回の場合は、氏名・メールアドレス・電話番号) $params = \Input::post(); // バリデーション実行 $validator = $this->validate($params); // バリデートに失敗した場合はリダイレクトし、エラーメッセージを表示 if (!$validator) { \Session::set_flash('errors', $this->validator->error()); \Response::redirect('/user/edit/' . $id); } // 更新処理 ... } /** * バリデーション実行 * @param array $params * @return bool */ private function validate(array $params) { $validator = \Validation::forge('user'); $validator->add_callable('\Api\Validation_MyRules'); $validator->add_field('name', '氏名', 'required|max_length[50]'); $validator->add_field('email', 'メールアドレス', 'required|valid_email|max_length[50]'); $validator->add_field('phone_number', '電話番号', 'required|max_length[15]|valid_string[numeric]'); if (!$validator->run($params)) { $this->validator = $validator; return false; } return true; } ... |
バリデーションを独自で拡張する場合は、以下のように新規ファイルを作成して独自ルールのメソッドを追加します。
・myrules.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php class Validation_MyRules { /** * ユーザーIDの存在チェック * * @param int $val * @return boolean */ public static function _validation_check_user_id($val) { $user = \Model_Db_User::find($val); return isset($user); } ... } |
使うときは以下のようにして呼び出します。
1 2 | $val = Validation::forge(); $val->add_callable('Validation_MyRules'); |
非静的に追加すると、静的メソッドも非静的メソッドも使用できます。
1 | $val->add_callable(new Validation_MyRules()); |