PHP验证器类Validator
Particle\Validator是⼀个⼩巧优雅的实⽤的PHP验证类库,提供了⼀个⾮常简洁的API。它⽆需依赖其他组件,提供友好的⽂档,并且有利于扩展。
安装
compor require particle/validator
使⽤
在使⽤之前请确保在项⽬中引⼊了 vendor/autoload.php ⽂件
Code:
1. <?php
2. u Particle\Validator\Validator;
3. require './vendor/autoload.php';
4. $v = new Validator;
5. $v->required('first_name')->lengthBetween(2, 30)->alpha();
6. $v->required('last_name')->lengthBetween(2, 40)->alpha();
7. $data = [
8. 'first_name' => 'John',
9. 'last_name' => 'Doe',
10. ];
11. $result = $v->validate($data);
12. $result->isValid(); // 返回bool(true or fal)
这个⽅法是内置的,主要⽤于检测某个key的值,如果希望检测的某个值可能为空,⽽希望验证通过,则我们可以设置该⽅法的第三个参数为true。(默认值为fal 代表不能为空值)。其中 required 和 optional 的区别主要是如下 required 是验证的值必须存在;⽽ optional 是可选的,如果key存在,则验证,不存在,则不⽤验证。
数组⽅式验证
Code:
1. // 基本验证
2. $values = [
3. 'ur' => [
4. 'urname' => 'bob',
5. ]
6. ];
7. $v = new Validator;
8. $v->required('ur.urname')->alpha();
9. $result = $v->validate($values);
10. $result->getValues() === $values; // bool(true)
内置验证规则\
allowEmpty(callable $callback)是否可以为空值,true则通过反之亦然
Code:
1. $v = new Validator;
2. // 如果⽤户名存在,则验证通过
3. $v->required('name')->allowEmpty(function (array $values) {
4. return $values['namePrent'] === true;
5. });
6. $v->validate(['namePrent' => true, 'name' => 'John'])->isValid(); // true
7. $v->validate(['namePrent' => true])->isValid(); // true
8. $v->validate(['namePrent' => fal])->isValid(); // fal
alnum($allowWhitespace = fal) 包含数字和字母,不允许空格,(a-z, A-Z, 0-9)
alpha($allowWhitespace = fal) 验证的字符包含 (a-z, A-Z),不允许空格。
between($min, $max) 验证必须在⼀个数值范围,如(12, 34)。
bool() 布尔Boolean值验证。
callback(callable $callable) 回调验证。
creditCard() 验证信⽤卡,验证之前必须先安装 compor require byrokrat/checkdigit。
datetime($format = null) 验证⽇期。
digits() ⼀串数字字符串验证,不包含⼩数。
each(callable $callable) 遍历验证。
email() 验证邮箱。
equals($value) 验证是否相等。
float()验证浮点数。
greaterThan($value) ⼤于某个值。
hash($hashAlgorithm, $allowUpperca = fal) md5 sha1等验证。
inArray(array $array, $strict = true) 验证是否属于数组范围内
integer($strict = fal) 整数验证。
isArray() 数组验证。
json()json格式字符串验证。
length($length) 长度验证。
lengthBetween($min, $max) 长度范围验证。
lessThan($value) ⼩于验证。
numeric() 验证浮点数和整数。
phone($countryCode) 验证⼿机号,使⽤之前先安装 compor require giggy/libphonenumber-for-php。regex($regex) 正则验证。
required(callable $callback) 必须存在,不能为空。
string() 字符串验证。
url($schemes = []) 验证URL。
uuid($version = Uuid::VALID_FORMAT) 验证UUID。
提⽰信息覆盖
Particle\Validator为默认规则提供了默认的消息提⽰,当然你也可以为验证规则设置特定的消息提⽰以覆盖默认值。
Code:
1. $v = new Validator;
2. $v->required('first_name')->lengthBetween(0, 5);
3. $v->required('last_name')->lengthBetween(0, 5);
4. $v->overwriteDefaultMessages([
5. LengthBetween::TOO_LONG => 'It\'s too long, that value'
6. ]);
7. $v->overwriteMessages([
8. 'first_name' => [
9. LengthBetween::TOO_LONG => 'First name is too long, mate'
10. ]
11. ]);
12. $result = $v->validate([
13. 'first_name' => 'this is too long',
14. 'last_name' => 'this is also too long',
15. ]);
16. var_dump($result->getMessages());
验证场景
验证库⼀般都可以根据场景来使⽤不同的验证,⽐如插⼊数据和更新数据的区别
Code:
1. $v = new Validator;
2. // 定义⼀个插⼊时候的验证规则
3. $v->context('inrt', function(Validator $context) {
4. $context->required('first_name')->lengthBetween(2, 30);
5. });
6. // 定义⼀个更新时候的验证规则
7. $v->context('update', function(Validator $context) {
8. $context->optional('first_name')->lengthBetween(2, 30);
9. });
10. $v->validate([], 'update')->isValid(); // bool(true)
11. $v->validate([], 'inrt')->isValid(); // bool(fal), becau first_name is required.
在MVC架构中使⽤验证器
很多时候,我们的项⽬都是进⾏分层开发的,例如常见的MVC,则我们可以在分层项⽬中调⽤该验证类,⽰例如下:Code:
1. u Particle\Validator\ValidationResult;
2. u Particle\Validator\Validator;
3. class MyEntity
4. {
5. protected $id;
6. public function tId($id)
7. {
8. $this->id = $id;
9. return $this;
10. }
11. public function validate() {
12. $v = new Validator;
13. $v->required('id')->integer();
14. return new $v->validate($this->values());
15. }
16. protected function values()
17. {
18. return [
19. 'id' => $this->id,
20. ];
21. }
22. }
23. // in a controller:
24. $entity = new Entity();
25. $entity->tId($this->getParam('id'));
26. $result = $entity->validate();
27. if (!$result->isValid()) {
28. return $this->renderTemplate([
29. 'messages' => $result->getMessages() // or maybe even just pass in $result.
30. ]);
31. }