使用symfony构建restful应用 - 验证器
目标:
上篇文章我们成功构建了异常处理,下面我们来构建自己的验证器
在官方文档:validator中,验证器常常以注解的方式使用,我们构建的
restful
架构使用自定义验证器。
验证器的简单使用
安装:
1 | composer require symfony/validator |
我们可以在控制器中使用简单的验证器来验证数据,像这样的:
1 |
|
如上,
- 如果验证通过就会抛出
Success
,表示请求成功且数据验证通过。 - 如果验证失败就会抛出
Parameter
,提示用户数据验证失败。
自定义验证器
上面我们已经能够成功使用验证器了,但是距离我们的预期太远了。如果多几个数据,多几个约束,光是一个数据的校验就几十行代码,可读性极差,不能重用,日后维护也很困难
我们需要构建自己的验证器。App\Validator\Base
代码实现:
1 |
|
上面的代码中,我们构建了自己的验证器基类。
只要验证不通过,就会抛出参数异常的错误(Parameter
);
子类只需要实现setCollection
定义约束就可以使用了。
自定义验证器的使用
我们来构建一个子类App\Validator\Example
:
1 |
|
让我们在控制器中使用它:
1 |
|
从数行代码变为一行代码,是不是简洁多了?
定义规则
上面我们虽然实现了自定义验证器。但是用的规则还是
symfony/validation
里面的,当需要验证特殊字段的时候(比如验证手机号码),我们还是需要自己定义的规则。
下面我们就来实现一下验证手机号码的规则。
1 | php bin/console make:validator Mobile |
上面的代码中,我们使用makebundle
帮我们自动生成了App\Validator\Mobile
和App\Validator\MobileValidator
,如果你没有安装makebundle
的话,执行以下命令:
1 | composer require symfony/maker-bundle --dev |
下面我们来实现App\Validator\Mobile
和App\Validator\MobileValidator
1 |
|
创建App\Rule\MobileValidator.php
文件,定义我们的规则:
1 |
|
上面代码中,我们用了一个简单的正则表达式来验证电话号码,失败后丢入错误的上下文中。
使用定义规则
我们已经有了自己定义的规则,我们怎么来使用它呢?
更新我们的App\Validator\Example
:
1 |
|
然后我们在控制器中使用它:
1 |
|
可以看到我们几乎没有改动控制器的代码,只是更新了验证的数据而已。
扩展 - 验证器与规则分层
到这里我们基本实现了自己的数据校验层,细心的同学可能发现了,我们的定义的规则和验证器都放在了App\Validator
下,其实这也没什么,但是以后验证层多起来,找文件非常困难,更何况还有可能有重名文件存在。
我们希望验证器和我们定义的规则分开,规则都放在App\Rule
下
上面我们通过makebundle
创建了我们的规则。同理我们可以创建自己的make
命令,不需要动其中的逻辑,只要简单的修改创建命令和创建规则的文件夹就行了。这里只是简单的实现,如果想深入的话,还请参阅源码
创建App\Make\Rule
,代码如下:
1 |
|
这样,我们就可以通过自己的命令创建规则了。
1 | php bin/console make:rule [rulename] |
以后创建的规则都定义在App\Rule
下,不用担心验证器和规则重名的问题。
由此,我们构建了自己的数据校验层,它十分简洁,分工明确,维护简单。
enjoy and happy coding!