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