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
|
If true, and the label of the validated field contains spaces, the label will be enclosed in double quotes for enhanced readability. |
global_input_fallback |
boolean |
true
|
If true, and value is not found in input array, the value will fall back to 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 のネイティブ関数やコールバック関数、無名関数を指定することもできます。
The method will get the value to
be validated as its first argument and any further arguments can be given to the add_rule() method.
We also provide a shorter syntax which is very limited in comparison. It will not accept array-callbacks,
closures or parameters other than strings. You can also not use the pipe symbol in your pattern when you use
the 'match_pattern' rule, as that is used to separate the defined rules.
// 上記の例と同じ動作をします
$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')))
バリデーションが実行されたとき、there are three methods available for information about the input:
// バリデートに成功したフィールドと値の組を配列で取得する
$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');
Validation can also run partially, in that case even required fields are ignored when they're not in
POST or the input given to run(). One does this by setting the 2nd parameter of run to true.
// this will only validate the password when username isn't present in post
$val->run(array('password' => 'whatever'), true);
バリデーションルール
すべてのメソッドは (min_length さえも)、空の入力に対して true を返すことに注意してください。
入力必須にするためには、"required" ルールを使う必要があります。
これらのすべてのルールは、次のように使えます:
// example normal usage with rule without and one with params
$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 正規表現 である必要があります。
Note: you can NOT use the pipe symbol (|) in your pattern when you're using short syntax, as that symbol is used to split the rules in the string.
|
match_field |
$field |
入力値が $fieldname フィールドと一致するかどうか。
比較には === が使用される。
Important: you can only match against a field that was added before the field this rule is added to.
|
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 ルールを参照してください。
Important: specified numbers are included in the range.
|
valid_string |
$flags = array('alpha', 'utf8') |
下記を参照。
|
Valid string ルール
$flags パラメータで与えられた条件を満たすかどうか検証します。
使用できる flag は次の通りです:
alpha |
アルファベットの文字列 |
uppercase |
アルファベット大文字の文字列 |
lowercase |
アルファベット小文字の文字列 |
numeric |
数字の文字列 |
spaces |
(一文字または複数の) スペース |
newlines |
(一文字または複数の) 改行文字 |
tabs |
(一文字または複数の) タブ |
dots |
(一文字または複数の) ドット |
commas |
(一文字または複数の) カンマ |
punctuation |
(一文字または複数の) ドット、カンマ、エクスクラメーションマーク、クエスチョンマーク、コロン、セミコロン |
dashes |
(一文字または複数の) ハイフンとアンダーバー |
singlequotes |
Allow single quotes. |
doublequotes |
Allow double quotes. |
quotes |
Allow single and double quotes. |
utf8 |
Adds UTF8 modifier to regex. |
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');
...
}