FuelPHPサイド
FuelBeans 18 : バリバリ、バリデーション
イェーィ、バリデーションだぜ、ベイベ。ノッてるかい?イェーイ!用意はいいかい?イェーイ!ソー、ヒア・ウィ・ゴー!
という訳で、バリデーションです。前回からの続きです。
前回はPOSTで入力されたのかどうかをチェックするところで、終了しました。
まずは、現時点では翻訳されていませんが、ドキュメントをどうぞ。
FuelPHP日本語ドキュメント(nekogetさん提供):Validation
それでは、典型的なコードをご覧ください。
<?php
class Controller_Login extends Controller
{
function action_index()
{
if (Input::method() == 'POST')
{
$val = Validation::forge();
$val->add('username', 'ユーザー名')
->add_rule('trim')
->add_rule('required')
->add_rule('min_length', 3)
->add_rule('max_length', 20)
;
$val->add('password', 'パスワード')
->add_rule('trim')
->add_rule('required')
->add_rule('min_length', 3)
->add_rule('max_length', 20)
;
// バリデーション
if ($val->run())
{
// バリデーションOK
// 次回はここでログインの処理だよ
}
else
{
// バリデーションNG
Session::set_flash('notice', $val->errors());
} // バリデーション終了
} // ポストチェック終了
$view = View::forge('form/login');
$view->title = 'ログイン';
return $view;
}
}
Validationクラスのforge()でインスタンスを生成します。
あとは、add()メソッドで、バリデーション対象を指定、add_rule()メソッドでチェックする内容を指定します。trimで前後の空白を取り除き、requireは必須項目、mini_lengthは最短の桁数の指定、max_lengthは最長桁数の指定です。
項目を設定したら、runメソッドでバリデーションのチェックを実行します。バリデーションが全部通ればtureが返ってきて、一つでも引っかかれば、falseになります。
本来はバリデーションが通ったら、ログイン処理です。オーサライズは次回になります。今回は、空行のまま開けておきましょう。バリデーションに集中しましょう。
バリデーションを実行後、インスタンスにはいくつかのプロパティ、まあ変数ができます。詳細はドキュメントのError Object(おいおい、前に見た時よりだいぶ項目が増えているぞ。) をご覧いただくとして、ポイントを絞って解説しましょう。
$val->validated()にはバリデーションを通過した値が返ってきます。引数としてフィールド名をわたします。通常は入力項目と同じですが、今回はtrimというルールを付けていますね。他のフレームワークでも使用されるtrimが隠しフューチャーとして存在しています。今のところ、ドキュメントに乗っていません。ですから、項目に入力された値の前後の空白が取り除かれた値が、入るはずです。(習得したデバッグテクニックで、確認してみてください。私の書いていることが古くなっている可能性も、間違っている可能性もありますよ。)
$val->errors()は、エラーメッセージの配列を返します。この2つが主にエラー処理に利用する関数です。
そしていきなりSessionクラスが使用されています。Sessionは素のPHPでもおなじみのセッションです。FuelPHPのセッションはデフォルトで、クッキーですが、保存先は変更できます。
Session::set_flash()の第1引数は、保存するキー値、第2引数は保存する値です。保存する値に$val->errors()でエラーメッセージを保存しています。set()もありますが、set_flash()はフラッシュデーター、つまり、一回のセッションで自動的に消去される仕組みです。エラーメッセージがいつまでも残り、表示されてしまえば、バグですからね。
セッションに渡されたエラーメッセージを表示する仕組みを作成しましょう。もし、セッションを使用するのが嫌ならば、使用することはありません。通常の項目と同様に、通常の変数を経由してビューに引き渡せば良いのです。今回はセッションを使用する方法でいきます。その理由は…すぐに分かりますよ。
では、まず、エラーをビューに表示する仕組みを作成しましょう。このように修正してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title><?php echo $title; ?></title>
</head>
<body>
<?php if (Session::get_flash('notice')) : ?>
<div>
<p><?php echo implode('</p><p>', (array) Session::get_flash('notice')); ?></p>
</div>
<?php endif; ?>
<h1><?php echo $title; ?></h1>
<?php echo Form::open(Uri::current()); ?>
<?php
echo Form::label('ユーザー名 : ', 'username');
?>
<?php echo Form::input('username', Input::post('username') ? : '', array('size' => 30)); ?>
<?php
echo Form::label('パスワード : ', 'password');
?>
<?php echo Form::password('password', Input::post('password') ? : '', array('size' => 30)); ?>
<?php
echo Form::submit('login', 'ログイン');
?>
<?php echo Form::close(); ?>
</body>
</html>
CMSなどのテンプレートではよく見かけるコードです。出力対象がなければ、空のdivやpも出力しません。設定してあるmerginのお陰で余計な隙間ができたりして、面倒ですからね。
今回、コントローラから渡したerrors()の戻り値は配列ですが、自分で使用するときは配列とは限りません。通常の文字列の時がほとんどでしょう。文字列であっても、配列であっても、正しく動作するコードになっています。
では、実行してみましょう。何も入力せず、ログインボタンを押してバリデーションエラーを表示してみましょう。すると、正しく…動かない!!
エラーメッセージの意味は、セッションに保存しようとしたデーターが4Kbを超えたため、(セッションに記録できるのは4Kbまででしたね)保存できないから、別のドライバーを使えということです。メッセージ自体は百バイト程度ですが、暗号化されるためにその他の情報と合計して、4Kbを超えてしまい、エラーが発生します。
ここで言うドライバーはFuelPHPの開発者が名付けたのでしょうが、要はPHPプログラムです。I/Oの方法毎にドライバープログラムを切り替えることで、上位のSessionクラスの振る舞いは変えず、保存対象だけを切り替えられるようにしています。
要は、設定ファイルの内容に従って、ドライバープログラムを切り替えることで、デフォルトでクッキーに保存していた内容を、DBに保存したり、ファイルに保存したり出来るのです。
やり方については、過去に書いた記事がありますので、参照してください。
今回はファイルに保存しましょう。DBの設定などは、まだ説明していませんからね。
細かい調節は後ほどご自身で、ドキュメントを参考にしながら行なってもらうとして、最低限の設定は、以上の通り簡単です。
FuelPHP日本語ドキュメント(nekogetさん提供)Session設定
では、動作させましょう。今度は、バリデーションエラーを発生させても、正しく動作します。設定していないため、エラーは英語で表示されます。(エラーの日本語化は多国語化で扱います。)
私の使っているコードテンプレートを利用している方でしたら、エディターでvalidと入力し、タブを押してください。コードが展開され、今回行ったコントローラー中のバリデーション処理のコードが表示されます。その中でチェックの全種類がズラリと表示されます。その部分だけ抜き出しますと:
$val->add('入力フィールド名', 'エラー時表示名')
->add_rule('trim')
->add_rule('required')
->add_rule('min_length', 5)
->add_rule('max_length', 400)
->add_rule('match_field', 'password') // フィールドの内容と一致
->add_rule('match_value', 23, ture) // 3つ目は===で比較
->add_rule('match_pattern', '') // 正規表現による比較
->add_rule('exact_length', 6) // 入力文字数が一致
->add_rule('valid_email')
->add_rule('valid_emails') // cc, bccなどで使用
->add_rule('valid_url')
->add_rule('valid_ip')
->add_rule('numeric_min',1) // 最低値(ドキュメントは間違い)
->add_rule('numeric_max',100) // 最高値(ドキュメントは間違い)
->add_rule('valid_string',
array(
'alpha',
'uppercase',
'lowercase',
'numeric',
'spaces',
'newlines',
'tabs',
'dots',
'punctuation', //,.!?:;に一致
'dashes', // -_に一致
'utf8',
)
)
// ドキュメント(core/validation/introdaction)に紹介されている拡張バリデーション
->add_rule('unique', array('table', 'field') // DBに値が存在するかチェック
;
ルール名でどんなバリデーションであるか一目瞭然です。コメントも入れてあります。validは有効なという意味です。
valid_stringルールは、その後の配列で、どの文字種類が含まれていてOKかを指定します。
一番最後、uniqueはコアに含まれていません。独自に拡張したルールです。独自といってもドキュメント中のサンプルコードですが、汎用性があるため、そのまま使っています。
このルールを使用するためには、controllersの下に、myvalidation.phpを作成します。コードは次のようになります。
<?php
class Myvalidation
{
public static function _validation_unique($val, $options)
{
// note ここでエラーメッセージを指定してしまうと、
// それで固定されてしまい、
// lang/国コード/validation.phpでの多国語化対応できない。
list($table, $field) = explode('.', $options);
$result = DB::select("LOWER (\"$field\")")
->where($field, '=', Str::lower($val))
->from($table)->execute();
return!($result->count() > 0);
}
}
この独自バリデーションはDBテーブルの指定された項目に入力項目が存在していないかチェックします。つまり、ダブりを調べるわけです。ダブっていたときはfalseです。ダブりがなければ、tureになります。使用方法は:
$val = Validation::forge();$val->add_callable('myvalidation');$val->add('username', 'ユーザー名')->add_rule('unique'.'テーブル名.項目名');
さあ、では試してください。入力項目は2つしかありませんが、バリデーションで試せるものは試してみましょう。最後のuniqueは試せませんよ。DBまだやっていませんからね。
| FuelBeans 16 : フォーム入力の基礎< 前 | 次 >FeulBeans 20 : ユーザー認証 |
|---|
| < 前 | 次 > |
|---|