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 (なし) フィールドがセットされ、nullfalse および空の文字列以外の値が与えられているか。
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 は次の通りです:

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');
...
}