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 then strings.

// 上記の例と同じ動作をします
$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]');

Once all the fields have been added you can run your validation. This will default to $_POST input, but be extended and overwritten when given an input array.

// run validation on just post
if ($val->run())
{
	// バリデーションに成功した場合の処理
}
else
{
	// 失敗
}

// alternative to above, overwriting the username in post, password will still be sought in 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 (なし) フィールドがセットされ、nullfalse および空の文字列以外の値が与えられているか。
required_with $fieldname $fieldname フィールドがセットされている場合に、フィールドに値がセットされているか。
match_value $compare, $strict = false 入力値が $compare と一致するかどうか。 比較には == が使用され、第2引数が true の場合は === が使用される。
match_pattern $pattern $pattern で与えられた PREG 正規表現にマッチするかどうか。
match_field $field 入力値が別のフィールドの値と一致しなければならない。 比較には === が使用される。
重要: 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_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 を見てください)
valid_string $flags = array('alpha', 'utf8') 下記を参照。

Valid string ルール

$flags パラメータで与えられた条件を満たすかどうか検証します。 使用できる flag は次の通りです:

Flag 説明
alpha アルファベットの文字列
uppercase アルファベット大文字の文字列
lowercase アルファベット小文字の文字列
numeric 数字の文字列
spaces (一文字または複数の) スペース
newlines (一文字または複数の) 改行文字
tabs (一文字または複数の) タブ
dots (一文字または複数の) ドット
commas (一文字または複数の) カンマ
punctuation (一文字または複数の) ドット、カンマ、エクスクラメーションマーク、クエスチョンマーク、コロン、セミコロン
dashes (一文字または複数の) ハイフンとアンダーバー
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');
...
}