当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

Validation - 类別

优质
小牛编辑
121浏览
2023-12-01

类别帮助你验证使用者输入,如果你想要同时建立一个表单&它的验证, 使用 Fieldset 类别代替。

配置

Validation 类别可以选择性的透过全域应用程序配置档案 app/config/config.php 来配置。定义一个名为 'validation' 的段落,在其中以下设定可以被定义:

变数类型预设描述
no_errors字串
''
如果没有发现验证错误要回传的字串。
open_list字串
'<ul>'
要被附加到错误列表前的字串。通常这是某种形式的 HTML 来格式化列表。预设情况下,它被格式化为一个无序列表。
close_list字串
'</ul>'
要被附加到错误列表后的字串。
open_error字串
'<li>'
要被附加到每个单一错误讯息前的字串。
close_error字串
'</li>'
要被附加到每个单一错误讯息后的字串。
quote_label布林
false
如果为 true,而且验证栏位的标籤包含空白,该标籤会被括在双引号中,以增强可读性。
global_input_fallback布林
true
如果为 true,而且值在输入阵列找不到,该值将退回到 Input::param。

如果全域配置中缺少这些值中的一个或多个时,类别将使用定义在这张表中的预设值。

用法

要开始验证你需要建立一个物件,这可以是名为 "default" 的预设物件, 或者你可以命名它如果你需要多个验证物件。

// 使用预设
$val = Validation::forge();

// ……或给它命名
$val = Validation::forge('my_validation');

在让它实例化之后,你可以开始添加栏位给它。这与使用 Fieldset 类别的运作完全一样, 然而这里我们只记录首选的用法。

$val = Validation::forge('my_validation');

// 添加一个 username 栏位,给它 "Your username" 标籤并让它为必要
$val->add('username', 'Your username')->add_rule('required');

// 现在添加另一个 password 栏位,并让它必须包含至少 3 个最多 10 个字元
$val->add('password', 'Your password')->add_rule('required')
    ->add_rule('min_length', 3)
    ->add_rule('max_length', 10);

// 现在为 gender 添加另一个栏位,并要求它包含 "M" 或 "F" 其中之一。
$val->add('gender', 'Your gender')->add_rule('required')
    ->add_rule('match_collection', array('M', 'F'));

add_rule() 方法的第一参数除了提供的验证方法之外,可以包含 PHP 原生函式名称、任何有效的 PHP 回呼(callback)和闭包(Closure)。该方法会取得要被验证做为其第一参数的值, 以及任何更多可以给 add_rule() 方法的参数值。

我们也提供了更短的语法,相对这非常受限。它不会接受阵列回呼(array-callback)、 闭包(closure)或字串以外的参数。你也不能在你的形式中使用管道符号(|)当你使用 '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 输入, 但可以在给一个输入阵列时被扩充并覆写。

// 执行刚发布的验证
if ($val->run())
{
	// 在验证成功时处理你的东西
}
else
{
	// 验证失败
}

// 替代上面,覆写 POST 中的 username,password 仍在 POST 中被徵询
if ($val->run(array('username' => 'something')))

在验证执行后,有三个关于输入资讯的可用方法:

// 取得一个验证成功栏位 => 值配对的阵列
$vars = $val->validated();
// 取得一个验证错误为栏位 => 错误配对的阵列
$errors = $val->error();
// 取得一个已验证输入的阵列,这合併了 post 和给 run() 的输入
$input = $val->input();

// 这些方法也都可以只取得单一栏位的值
$var = $val->validated('username');

验证也可以部份执行,在这种情况下甚至 required 栏位会被忽略,当他们不在 POST 中或输入给 run()。 透过设定执行的第二参数为 true 能做到。

// 这会只验证 password,当 username 没有出现在 POST 时
$val->run(array('password' => 'whatever'), true);

验证规则

请注意,所有方法(甚至 min_length)在空白输入时也会回传 true。 也要要求栏位你应该添加 "required" 规则。

这些规则都可以像以下这样被使用:

// 一般使用範例,一个没参数的规则,和另一个有参数的规则
$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,会使用 == 做,除非第二参数也给 true (那幺会使用 ===)。
match_pattern$pattern会尝试针对所给 $pattern(必须是完整 PREG 正规表达式)相配值。

注意:不能 在你的形式中使用管道符号(|)当你使用短语法,因为该符号被用来在字串中拆分规则。

match_field$field会尝试相配该栏位与所给名称的栏位, 相配会使用 ===。

重要:你只能针对此规则添加到栏位之前的栏位进行相配。

match_collection$collection = array()会试着针对集合的有效值进行栏位匹配。
min_length$length测试该字串是否包含至少 $length 的字元数。
max_length$length测试该字串是否包含不超过 $length 的字元数。
exact_length$length测试该字串是否有准确 $length 的字元数。
valid_date$format, $strict = true验证所给输入是否为有效的日期格式。如果有给 $format 参数,验证会使用指定格式。 会严格(例如:闰年)检查除非第二参数是给 false。
valid_email(无)验证所给输入是否为有效的 Email 地址。
valid_emails$separator(选择性)验证多个以逗号(或 $separator)分隔的 Email 地址。
valid_url(无)验证所给输入是否是有效的 URL。
valid_ip(无)验证所给输入是否是有效的 IP。
numeric_min$min_val测试所给输入是否是一个大于 $min_val 的数字, 它不检查或转化输入为数字值,所以任何非数字值会被认为是 0。 使用 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')见以下。

有效字串规则

验证字串是否坚持 $flags 参数设定的条件。 接受的标誌有:

标誌描述
alpha允许字母字元。
uppercase与只允许大写字元字母的组合使用。
lowercase与只允许小写字元字母的组合使用。
numeric允许数字字元。
spaces允许一般空白。
newlines允许换行符号。
tabs允许 tab。
dots允许点。
commas允许逗号。
punctuation允许点、逗号、惊叹号、问号、冒号和分号。
dashes允许破折号和底线。
singlequotes允许单引号。
doublequotes允许双引号。
quotes允许单引号和双引号。
forwardslashes允许正斜线。
backwardslashes允许反斜线。
slashes所有正反斜线。
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(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. 从模型呼叫回呼(callback),它运作就像上面所描述的方法,但我们只需要用其他方式呼叫它:

$val = Validation::forge();
$val->add_model('Model_User');

注意: 你需要用于方法的 '_validation_' 前缀以在验证中是可用的。

注意: 如果你传递类别名称做为一个字串,验证方法必须被定义为静态。如果方法不是静态,你将必须传递一个物件实例做为 callable()。

使用 Validation::active()Validation::active_field() 来分别取得目前活跃的 validation 实例与目前被验证的栏位会是有用的。

例如,在上述你可以这样做:

public static function _validation_unique($val, $options)
{
	Validation::active()->set_message('unique', 'The field :label must be unique, but :value has already been used');
...
}