silverware / validator
SilverWare 验证器模块。
Requires
- php: >=5.6.0
- guzzlehttp/guzzle: ^6.2
- silverstripe/framework: ^4@dev
README
为 SilverStripe v4 提供的表单验证模块,支持替代客户端后端和可定制的验证规则。默认使用 Parsley.js 作为验证后端。默认配置适用于 Bootstrap v4 表单。
内容
需求
- SilverStripe 框架 v4
- Bootstrap v4 (用于默认配置)
安装
通过 Composer 安装
$ composer require silverware/validator
配置
与所有 SilverStripe 模块一样,配置通过 YAML 完成。使用 SilverStripe 依赖注入器配置验证器后端。该模块包含使用 Parsley.js 的后端。
SilverStripe\Core\Injector\Injector: ValidatorBackend: class: SilverWare\Validator\Backends\ParsleyBackend
该模块被设计为尽可能的“后端无关”。虽然 Parsley.js 非常强大,应该能满足大多数验证需求,但你当然可以自己实现后端并使用配置将其集成到验证器前端。
使用
要使用您的应用中的验证器,只需在代码的头部 use
验证器类
use SilverWare\Validator\Validator;
您还需要 use
您想要应用于表单的验证器规则类,例如
use SilverWare\Validator\Rules\LengthRule; use SilverWare\Validator\Rules\PatternRule; use SilverWare\Validator\Rules\RequiredRule;
在返回 Form
的控制器方法中创建验证器实例,例如
public function Form() { $fields = FieldList::create([ ... ]); $actions = FieldList::create([ ... ]); $validator = Validator::create(); // define validator rules here! $form = Form::create($this, 'Form', $fields, $actions, $validator); return $form; }
现在您可以使用下面的方法定义您的验证器规则。
验证器规则
SilverWare 验证器附带了许多预构建的规则,您可以立即使用它们来验证您的表单。这些规则支持客户端和服务器端验证。SilverWare 验证器包括以下规则类
AlphaNumRule
CheckRule
ComparisonRule
DateRule
DigitsRule
DomainRule
EmailRule
EqualToRule
IntegerRule
LengthRule
MaxCheckRule
MaxLengthRule
MaxRule
MaxWordsRule
MinCheckRule
MinLengthRule
MinRule
MinWordsRule
NotEqualToRule
NumberRule
PatternRule
RangeRule
RemoteRule
RequiredRule
URLRule
WordsRule
以下将详细介绍每个规则。
设置规则
要为特定表单字段设置规则,请使用 setRule
方法,并传递字段名和规则实例。例如
$validator->setRule( 'MyFieldName', LengthRule::create(10, 20) // this field's value must be 10-20 characters in length );
要为字段设置多个规则,可以使用 setRules
方法并传递一个规则实例数组
$validator->setRules( 'MyDomainName', [ RequiredRule::create(), // this field is required DomainRule::create() // this field must be a valid domain name ] );
必填字段
由于字段通常对于几乎任何表单都是必需的,因此提供了一些快捷方法来定义必填字段。使用 addRequiredField
与字段名和可选的自定义消息参数
$validator->addRequiredField('MyRequiredField'); $validator->addRequiredField('MyOtherRequiredField', 'Dis field be mandatory, yo!');
要批量添加必填字段,请使用 addRequiredFields
与字段名数组
$validator->addRequiredFields([ 'ThisFieldIsRequired', 'SoIsThisField', 'AndThisField' ]);
自定义消息
所有规则类都包含一个默认消息,当规则验证失败时显示给用户。您可以通过在规则上使用 setMessage
方法来自定义消息,例如
$validator->setRule( 'MyAge', MaxRule::create(130)->setMessage( 'I find it hard to believe you are over 130 years old!' ) )
禁用验证
默认情况下,SilverWare Validator 执行客户端和服务器端验证。虽然建议启用两种验证方法,但如果您需要禁用其中一种,可以使用以下方法
$validator->setClientSide(false); // disables client-side validation $validator->setServerSide(false); // disables server-side validation
触发事件
默认情况下,开箱即用的验证器 Parsley.js 会触发字段更改时的表单验证。您可以通过在后端使用 setTriggerOn
方法来自定义何时触发验证,例如
$validator->getBackend()->setTriggerOn([ 'focusin', 'focusout' ]);
您也可以简单地传递触发事件作为字符串
$validator->getBackend()->setTriggerOn('focusin focusout');
Parsley.js 支持通过任何标准 jQuery 事件 触发。
规则
AlphaNumRule
use SilverWare\Validator\Rules\AlphaNumRule;
测试输入的值是否是字母数字字符串,仅包含基本字母、数字和下划线字符。
$validator->setRule( 'MyFieldName', AlphaNumRule::create() );
CheckRule
use SilverWare\Validator\Rules\CheckRule;
用于类似 OptionsetField
(如 CheckboxSetField
)的控件。确保用户在给定的 $min
和 $max
参数之间选择一定数量的选项。
$validator->setRule( 'MyCheckboxSet', CheckRule::create(2, 4) // user must select between 2 and 4 options );
ComparisonRule
use SilverWare\Validator\Rules\ComparisonRule;
使用指定的比较类型比较一个字段的值与另一个字段的值
ComparisonRule::LESS_THAN
ComparisonRule::LESS_THAN_OR_EQUAL
ComparisonRule::GREATER_THAN
ComparisonRule::GREATER_THAN_OR_EQUAL
$validator->setRule( 'MyLesserValue', ComparisonRule::create( ComparisonRule::GREATER_THAN, 'MyGreaterValue' ) );
DateRule
use SilverWare\Validator\Rules\DateRule;
确保输入的值是特定格式的日期。规则构造函数支持两个参数。第一个参数是使用客户端 Moment.js 规范的必需日期格式。
可选的第二个参数指定服务器端 PHP 日期格式,但如果省略第二个参数,规则将适当地转换客户端格式。
$validator->setRule( 'MyDateField', DateRule::create('YYYY-MM-DD') // ensures an ISO standard date, e.g. 2017-05-12 );
DigitsRule
use SilverWare\Validator\Rules\DigitsRule;
确保仅输入数字,即仅数字 0-9。
$validator->setRule( 'MyDigitsField', DigitsRule::create() );
DomainRule
use SilverWare\Validator\Rules\DomainRule;
测试输入的值是否是有效的域名。支持新的顶级域名(TLD)和 localhost
。
$validator->setRule( 'MyDomainName', DomainRule::create() );
EmailRule
use SilverWare\Validator\Rules\EmailRule;
确保值是有效的电子邮件地址。
$validator->setRule( 'MyEmailField', EmailRule::create() );
EqualToRule
use SilverWare\Validator\Rules\EqualToRule;
确保一个字段的值与另一个字段的值相等。
$validator->setRule( 'MyFirstValue', EqualToRule::create('MySecondValue') );
IntegerRule
use SilverWare\Validator\Rules\IntegerRule;
测试输入的值是否是有效的正整数或负整数。
$validator->setRule( 'MyIntField', IntegerRule::create() );
LengthRule
use SilverWare\Validator\Rules\LengthRule;
确保输入值的长度在指定的 $min
和 $max
范围内。
$validator->setRule( 'MyFieldName', LengthRule::create(20, 40) // value must be between 20-40 characters in length );
MaxCheckRule
use SilverWare\Validator\Rules\MaxCheckRule;
用于类似 OptionsetField
(如 CheckboxSetField
)的控件。指定用户只能选择最大数量的选项。
$validator->setRule( 'MyCheckboxSet', MaxCheckRule::create(4) // user can select a maximum of 4 options );
MaxLengthRule
use SilverWare\Validator\Rules\MaxLengthRule;
确保输入值的最大长度。
$validator->setRule( 'MyFieldName', MaxLengthRule::create(40) // value must be 40 characters in length or less );
MaxRule
use SilverWare\Validator\Rules\MaxRule;
测试数值是否小于或等于指定的金额。
$validator->setRule( 'MyNumberField', MaxRule::create(255) // number value must be 255 or less );
MaxWordsRule
use SilverWare\Validator\Rules\MaxWordsRule;
确保值不超过指定的单词数量。
$validator->setRule( 'MyTextArea', MaxWordsRule::create(50) // value must be 50 words or less );
MinCheckRule
use SilverWare\Validator\Rules\MinCheckRule;
用于类似 OptionsetField
(如 CheckboxSetField
)的控件。确保用户选择最小数量的选项。
$validator->setRule( 'MyCheckboxSet', MinCheckRule::create(2) // user must select at least 2 options );
MinLengthRule
use SilverWare\Validator\Rules\MinLengthRule;
确保输入值的最小长度。
$validator->setRule( 'MyFieldName', MinLengthRule::create(20) // value must be at least 20 characters in length );
MinRule
use SilverWare\Validator\Rules\MinRule;
测试数值是否大于或等于指定的金额。
$validator->setRule( 'MyNumberField', MinRule::create(42) // the entered value must be 42 or greater );
MinWordsRule
use SilverWare\Validator\Rules\MinWordsRule;
确保值至少包含指定的单词数量。
$validator->setRule( 'MyTextArea', MinWordsRule::create(20) // value must contain at least 20 words );
NotEqualToRule
use SilverWare\Validator\Rules\NotEqualToRule;
确保一个字段的值与另一个字段的值不相等。
$validator->setRule( 'MyFirstValue', NotEqualToRule::create('MySecondValue') );
NumberRule
use SilverWare\Validator\Rules\NumberRule;
测试输入的值是否是数值,即整数或浮点数。
$validator->setRule( 'MyNumericValue', NumberRule::create() // value must be numeric );
PatternRule
use SilverWare\Validator\Rules\PatternRule;
使用正则表达式测试输入值。请确保您的正则表达式在 JavaScript 和 PHP preg_match
中都能正常工作,以便客户端和服务器端验证函数能正确执行。
$validator->setRule( 'MyFieldName', PatternRule::create('/ware$/') // ensures the entered string ends with 'ware' );
RangeRule
use SilverWare\Validator\Rules\RangeRule;
指定输入值必须介于其间的数字范围。
$validator->setRule( 'MyNumericValue', RangeRule::create(1, 5) // value must be between 1 and 5 );
RemoteRule
use SilverWare\Validator\Rules\RemoteRule;
使用 Ajax 请求在客户端测试值,并使用 Guzzle 在提交到服务器时测试值。
规则构造函数允许以下参数
$rule = RemoteRule::create( $url, // url to call $params, // request parameters, e.g. ['myVar' => 123] $options, // options for request, e.g. ['type' => 'POST'] $remoteValidator // remote validator to use, 'default' or 'reverse' );
例如,您可能使用 RemoteRule
来检查用户名是否可用
$validator->setRule( 'MyUserName', RemoteRule::create( $this->Link('checkusername') // controller method )->setMessage('That username is unavailable') );
服务器将接收字段的名称及其值作为参数,例如 ?MyUserName=sallybloggs
。默认情况下,如果 RemoteRule
收到 200-299 之间的 HTTP 状态码,则认为它是有效的。其他任何情况都将返回无效结果。
如果您想反转此行为,即 200-299 被视为无效,您可以使用“反向”模式
$validator->setRule( 'MyUserName', RemoteRule::create( $this->Link('checkusername') )->setRemoteValidator('reverse') );
有关使用远程验证的更多信息,请参阅 Parsley.js 文档。
RequiredRule
use SilverWare\Validator\Rules\RequiredRule;
将指定的字段定义为必填(强制)字段,用户必须完成。
$validator->setRule( 'MyRequiredField', RequiredRule::create() );
URLRule
use SilverWare\Validator\Rules\URLRule;
确保输入的值是有效的 URL。
$validator->setRule( 'MyURL', URLRule::create() );
WordsRule
use SilverWare\Validator\Rules\WordsRule;
确保输入的值介于 $min
和 $max
个单词之间。
$validator->setRule( 'MyTextArea', WordsRule::create(10, 25) // user must enter between 10 and 25 words );
问题
请使用 GitHub 问题跟踪器提交错误报告和功能请求。
待办事项
- 测试
贡献
我们非常欢迎您的贡献,以帮助使此项目变得更好。请参阅 贡献指南 获取更多信息。
归属
- 使用由 Parsley.js,由 Guillaume Potier 提供。
- 使用由 Moment.js,由 Iskren Ivov Chernev 和其他人员提供。
- 使用由 Guzzle,由 Michael Dowling 和其他人员提供。
- 使用由 Bootstrap,由 Bootstrap 作者 和 Twitter, Inc 提供。
- 灵感来源于 SilverStripe ZenValidator,由 Shea Dawson 提供。
维护者
许可
BSD-3-Clause © Praxis Interactive