Validation クラス
Validation クラスは、ユーザ入力をバリデーションする際の手助けをします。
フォームの生成とバリデーションを同時にしたい場合は、代わりに Fieldset クラスを使用してください。
設定
オプションで、アプリケーション全体の設定ファイル app/config/config.php で validation クラスの設定を行うことができます。 'validation' セクションを定義し、以下の設定を行うことができます。
変数 |
型 |
デフォルト |
説明 |
no_errors |
string |
''
|
バリデーションでエラーが見つからなかった場合に返す文字列。 |
open_list |
string |
'<ul>'
|
エラーのリストの先頭に付加される文字列。通常、リストを定義する HTML タグになります。デフォルトでは、番号なしリストになります。 |
close_list |
string |
'</ul>'
|
エラーのリストの末尾に付加される文字列。 |
open_error |
string |
'<li>'
|
個々のエラーメッセージの先頭に付加される文字列。 |
close_error |
string |
'</li>'
|
個々のエラーメッセージの末尾に付加される文字列。 |
quote_label |
boolean |
false
|
true にした場合で、バリデーションされたフィールドが半角空白を含む場合、可読性向上のためダブルクォートで括ります。 |
global_input_fallback |
boolean |
true
|
true にした場合で、入力された配列に値が見つからなかった場合、値は Input::param になります。 |
これらの値が定義されない場合、上記の表に示したデフォルト値が使用されます。
使用方法
バリデーションを開始するには、オブジェクトを生成する必要があります。
デフォルトでは "default" という名前のオブジェクトになりますが、複数のバリデーションオブジェクトが必要な場合は名前を付けることができます。
// デフォルトを使う
$val = Validation::forge();
// 名前を付ける
$val = Validation::forge('my_validation');
インスタンスを生成したら、フィールドを追加していきます。
Fieldset クラスを使用するときと全く同じように動作しますが、ここでは推奨する使用方法のみを示します。
$val = Validation::forge('my_validation');
// ユーザ名用のフィールドを追加して "Your username" というラベルを付加し、入力必須にする
$val->add('username', 'Your username')->add_rule('required');
// そしてさらにパスワード用のフィールドを追加し、3文字以上10文字以下の入力必須にする
$val->add('password', 'Your password')->add_rule('required')
->add_rule('min_length', 3)
->add_rule('max_length', 10);
add_rule() メソッドの第1パラメータには、本機能で提供するルールに加え、任意の PHP のネイティブ関数やコールバック関数、無名関数を指定することもできます。
コールバック関数は、バリデーションされる値を第一パラメータに取ります。
また add_rule() メソッドにパラメータを渡すと、第二パラメータ以降に取ることもできます。
短縮構文を提供しています。記述が非常に短くなります。
配列コールバック、クロージャ、パラメータ(文字列を除く)は受け付けません。match_pattern ルールを使用するとき、パイプ記号は使用できません。
パイプ記号をルールの区切りに使用するからです。
// 上記の例と同じ動作をします
$val = Validation::forge('my_validation');
$val->add_field('username', 'Your username', 'required');
$val->add_field('password', 'Your password', 'required|min_length[3]|max_length[10]');
すべてのフィールドを追加したら、バリデーションを実行することが出来ます。
デフォルトでは $_POST ですが、入力を与えることで、上書きや拡張することが出来ます。
// POSTに対してバリデーションを実行
if ($val->run())
{
// バリデーションに成功した場合の処理
}
else
{
// 失敗
}
// 上記の代わりに POST の username を上書きし、 password を POST の中から探す
if ($val->run(array('username' => 'something')))
バリデーションが実行されたとき、入力についての情報を知るメソッドが 3 つあります。
// バリデートに成功したフィールドと値の組を配列で取得する
$vars = $val->validated();
// バリデーションエラーをフィールドとエラー内容の組の配列で取得する
$errors = $val->error();
// get an array of the input that was validated, this merged the post & input given to run()
$input = $val->input();
// これらのメソッドでは、一つのフィールドにおいて値だけを取得することもできます
$var = $val->validated('username');
バリデーションは部分的に実行することができます。必須フィールドでさえ、POST やrun() の入力に含まれていないときに無視することができます。
run の第二パラメータを true にしてください。
// username が POST に無い場合に、password のみをバリデートする。
$val->run(array('password' => 'whatever'), true);
バリデーションルール
すべてのメソッドは (min_length さえも)、空の入力に対して true を返すことに注意してください。
入力必須にするためには、"required" ルールを使う必要があります。
これらのすべてのルールは、次のように使えます:
// パラメータ無しの例と、パラメータ 1 つの例
$val->add('email', 'Email address')->add_rule('match_value', 'me@mydomain.com', true)->add_rule('valid_email');
$val->add_field('email', 'Email address', 'match_value[me@mydomain.com,1]|valid_email');
ルール表
required |
(なし) |
フィールドがセットされ、null、false
および空の文字列以外の値が与えられているか。
|
required_with |
$fieldname |
$fieldname フィールドがセットされている場合に、フィールドに値がセットされているか。
|
match_value |
$compare, $strict = false |
入力値が $compare と一致するかどうか。
比較には == が使用され、第2パラメータが true の場合は === が使用される。
|
match_pattern |
$pattern |
入力値が $pattern とマッチするかどうか。$pattern は完全な PREG 正規表現 である必要があります。
注意: 短縮構文では、パイプ記号 | は使用できません。この記号はルールの区切りに使用します。
|
match_field |
$field |
入力値が $fieldname フィールドと一致するかどうか。
比較には === が使用される。
重要: このルールを追加するフィールドよりも前に追加されたフィールドのみ一致対象とすることができます。
|
min_length |
$length |
文字数が $length 文字以上かどうか。
|
max_length |
$length |
文字数が $length 文字以内かどうか。
|
exact_length |
$length |
文字数が $length 文字かどうか。
|
valid_date |
$format, $strict = true |
有効な日付形式かどうか。もし、 $format が指定された場合は、指定されたフォーマットに基づいて比較されます。
第2パラメータが false でない限り、厳密な比較が行われます。(たとえば閏年など)
|
valid_email |
(なし) |
有効な email アドレスかどうか。
|
valid_emails |
$separator (optional) |
カンマ (または $separator) で区切られた、有効な email アドレスかどうか。
|
valid_url |
(なし) |
有効な URL アドレスかどうか。
|
valid_ip |
(なし) |
有効な IP アドレスかどうか。
|
numeric_min |
$min_val |
数値が $min_val 以上かどうか。
入力値が数値かどうかのチェックやキャストはしないので、数値でない文字列はゼロとみなされます。
これをチェックするには、まず PHP の is_numeric 関数を使用してください。
|
numeric_max |
$max_val |
数値が $max_val 以下かどうか。
入力値が数値で無い場合については、 numeric_min ルールを参照してください。
|
numeric_between |
$min_val, $max_val |
数値が $min_val から $max_val の範囲内かどうか。
入力値が数値で無い場合については、 numeric_min ルールを参照してください。
重要: 端の数値は含む。
|
valid_string |
$flags = array('alpha', 'utf8') |
下記を参照。
|
Valid string ルール
$flags パラメータで与えられた条件を満たすかどうか検証します。
使用できる flag は次の通りです:
alpha |
アルファベットの文字列 |
uppercase |
アルファベット大文字の文字列 |
lowercase |
アルファベット小文字の文字列 |
numeric |
数字の文字列 |
spaces |
(一文字または複数の) スペース |
newlines |
(一文字または複数の) 改行文字 |
tabs |
(一文字または複数の) タブ |
dots |
(一文字または複数の) ドット |
commas |
(一文字または複数の) カンマ |
punctuation |
(一文字または複数の) ドット、カンマ、エクスクラメーションマーク、クエスチョンマーク、コロン、セミコロン |
dashes |
(一文字または複数の) ハイフンとアンダーバー |
singlequotes |
シングルクォート |
doublequotes |
ダブルクォート |
quotes |
シングルクォートとダブルクォート |
brackets |
角括弧 (左と右) |
braces |
波括弧 (左と右) |
utf8 |
UTF8 修飾子 (正規表現) |
Validation クラスを拡張する
validation クラスを拡張する方法は、いくつかあります。
1. コアクラスの拡張で説明されているように、コアクラスを拡張する
2. (例えば) app/classes/myrules.php にクラスを作成する
// app/classes/myrules.php
class MyRules
{
// 静的メソッドであることに注意する
public static function _validation_unique($val, $options)
{
list($table, $field) = explode('.', $options);
$result = DB::select("LOWER (\"$field\")")
->where($field, '=', Str::lower($val))
->from($table)->execute();
return ! ($result->count() > 0);
}
// 非静的メソッドであることに注意する
public function _validation_is_upper($val)
{
return $val === strtoupper($val);
}
}
// 以下のようにして呼び出す
$val = Validation::forge();
// 静的ルールと非静的ルールの違いに注意する
// 静的に追加すると、静的メソッドのみ使用できる
$val->add_callable('MyRules');
// 非静的に追加すると、静的メソッドも非静的メソッドも使用できる
$val->add_callable(new MyRules());
$val->add('username', 'Your username', array(), array('trim', 'strip_tags', 'required', 'is_upper'))
->add_rule('unique', 'users.username');
3. モデルからコールバックを呼び出す。上述のメソッドのように動作するが、別の方法で呼び出す必要がある
$val = Validation::forge();
$val->add_model('Model_User');
注意:
バリデーションで利用可能にするには '_validation_' プレフィクスが必要です。
注意:
クラス名を文字列として渡す場合は、バリデーションメソッドが静的メソッドで定義される必要があります。メソッドが非静的の場合は、オブジェクトインスタンスをを callable() として渡す必要があります。
現在アクティブなバリデーションインスタンスと、現在検証されているフィールドを取得するには、それぞれ Validation::active() と Validation::active_field() を使用すると便利でしょう。
Validation::active を利用した例です。
public static function _validation_unique($val, $options)
{
Validation::active()->set_message('unique', 'The field :label must be unique, but :value has already been used');
...
}