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);
// そしてさらにジェンダーフィールドを追加し、"M" か "F" が含まれるようにする
$val->add('gender', 'Your gender')->add_rule('required')
->add_rule('match_collection', array('M', 'F'));
add_rule() メソッドの第 1 パラメータには、本機能で提供するルールに加え、任意の PHP のネイティブ関数やコールバック関数、無名関数を指定することもできます。
コールバック関数は、バリデーションされる値を第 1 パラメータに取ります。
また add_rule() メソッドにパラメータを渡すと、第 2 パラメータ以降に取ることもできます。
短縮構文を提供しています。記述が非常に短くなります。
配列コールバック、クロージャ、パラメータ(文字列を除く)は受け付けません。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]');
$val->add_field('gender', 'Your gender', 'required|match_collection[M,F]');
すべてのフィールドを追加したら、バリデーションを実行することが出来ます。
デフォルトでは $_POST ですが、入力を与えることで、上書きや拡張することが出来ます。
// POSTに対してバリデーションを実行
if ($val->run())
{
// バリデーションに成功した場合の処理
}
else
{
// 失敗
}
// 上記の代わりに POST の username を上書きし、 password を POST の中から探す
if ($val->run(array('username' => 'something')))
バリデーションが実行されたとき、入力についての情報を知るメソッドが 3 つあります。
// バリデートに成功したフィールドと値の組を配列で取得する
$vars = $val->validated();
// バリデーションエラーをフィールドとエラー内容の組の配列で取得する
$errors = $val->error();
// バリデーションされた入力の配列を取得する。POSTと、run() の入力がマージされる
$input = $val->input();
// これらのメソッドでは、 1 つのフィールドにおいて値だけを取得することもできます
$var = $val->validated('username');
バリデーションは部分的に実行することができます。必須フィールドでさえ、POST やrun() の入力に含まれていないときに無視することができます。
run の第 2 パラメータを 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 フィールドと一致するかどうか。
比較には === が使用される。
重要: このルールを追加するフィールドよりも前に追加されたフィールドのみ一致対象とすることができます。
|
match_collection |
$collection = array(), $strict = false |
入力値が、妥当な値で構成されたコレクションにマッチするかどうか。
比較には == が使用され、第 2 パラメータが true の場合は === が使用される。
|
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 (オプション) |
カンマ (または $separator) で区切られた、有効な email アドレスかどうか。
|
valid_url |
(なし) |
有効な URL アドレスかどうか。
|
valid_ip |
$flag (optional) |
Validates if the given input is a valid IP address. You can set 'ipv4' or 'ipv6' to $flag to check a specific IP address format.
|
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 パラメータで与えられた条件を満たすかどうか検証します。
使用できるフラグは次の通りです:
alpha |
アルファベットの文字を許可。 |
uppercase |
alpha と組み合わせ使用することでアルファベット大文字だけを許可。 |
lowercase |
alpha と組み合わせ使用することでアルファベット小文字だけを許可。 |
specials |
アルファベットと特殊な言語の文字を許可。 |
numeric |
数字の文字を許可。 |
spaces |
通常のスペースを許可。 |
newlines |
改行文字を許可。 |
tabs |
タブ文字を許可。 |
dots |
ドットを許可。 |
commas |
カンマを許可。 |
punctuation |
ドット、カンマ、エクスクラメーションマーク (訳注:ビックリマークのこと)、クエスチョンマーク、コロン、セミコロンを許可。 |
dashes |
ハイフンおよびアンダーライン (訳注:アンダーバー、アンダースコアとも) を許可。 |
singlequotes |
シングルクォートを許可。 |
doublequotes |
ダブルクォートを許可。 |
quotes |
シングルクォートおよびダブルクォートを許可。 |
forwardslashes |
スラッシュを許可。 |
backwardslashes |
バックスラッシュを許可。 |
slashes |
スラッシュおよびバックスラッシュを許可。 |
brackets |
開き "[" と閉じ "]" の角括弧を許可。 |
braces |
開き "{" と閉じ "}" の波括弧を許可。 |
utf8 |
正規表現に UTF-8 修飾子を追加。 |
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(DB::expr("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');
...
}