博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
laravel input值必须不等于0_框架不提供,动手造一个:Laravel表单验证自定义用法...
阅读量:6409 次
发布时间:2019-06-23

本文共 2458 字,大约阅读时间需要 8 分钟。

引言

本文说一说Laravel内,如何使用自定义的验证规则框架自带的规则,已然不够用了。我们从三个常见的验证需求出发,使用代码将其实现。

e1324867c6abd8fd47200b526525afc2.png

有效的MAC地址

首先编写必要的逻辑,确保用户输入了有效的MAC地址。根据这些惯例,需满足以下条件:

  • 必须提供六段八进制数字(大写或小写)。
  • 一个八进制段必须由一个数字或A-F字母组成。
  • 每段八进制数字必须用冒号或破折号隔开。

最简单的方法是使用正则表达式:

public function passes($attribute, $value){
return preg_match( "/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/", $value );}

接下来写一个错误消息,当用户提供了非法的MAC地址的值时作出响应:

public function message(){
return 'The :attribute must be a valid MAC address;}

我们编写一个快速单元测试,以确认上述的规则正确:

/** @test */public function the_mac_address_rule_can_be_validated(){
$rule = ['address' => [new MacAddress]]; $this->assertTrue(validator(['address' => '3D:F2:C9:A6:B3:4F'], $rule)->passes()); $this->assertTrue(validator(['address' => '3D-F2-C9-A6-B3-4F'], $rule)->passes()); $this->assertFalse(validator(['address' => '00:00:00:00:00:00:00'], $rule)->passes());}

文件是否存在

允许用户提供文件的路径,并验证该文件是否存在。为此,我们需要接受两个参数:

  • 文件的磁盘路径,在配置中的 filesystems.php 文件设置。
  • 文件本身的目录。

然后,使用 storage facade 来执行检查,同时也会对用户输入执行一些初始过滤,以消除文件路径中的任何转义符:

public function passes($attribute, $value){
$path = rtrim($this->parameters[1] ?? '', '/'); $file = ltrim($value, '/'); return Storage::disk($this->parameters[0]) ->exists("$path/$file");}

需要写一个错误消息来响应:

public function message(){
return 'The file specified for :attribute does not exist';}

包括单元测试:

/** @test */public function the_file_exists_rule_can_be_validated(){
$rule = ['file' => [new FileExists('local', '/')]]; $this->assertTrue(validator(['file' => 'real.txt'], $rule)->passes()); $this->assertFalse(validator(['file' => 'fake.txt'], $rule)->passes());}

请注意,实际的单元测试可能更复杂,因为必须按步骤来设置配置文件、创建测试文件等。

值相等

这一条规则更像是“语法糖”。从技术上讲,你可以使用Laravel的 in 规则实现相同的功能,并提供单个值,而不是许多逗号分隔的选项。

然而,“in”这个词意味着多个值是有效的,而在特定的场景中,可能只有一个值真正有用。在这种情况下,我认为使用“equals”在语义上更容易理解。

逻辑很简单。有一个参数,我们比较提供的值,并确保其相等:

public function passes($attribute, $value){
return $value === $this->parameters[0];}

包括错误响应:

public function message(){
return 'The :attribute must be set to "' . $this->parameters[0] . '"';}

接着单元测试:

/** @test */public function the_equals_rule_can_be_validated(){
$rule = ['value' => [new Equals('2')]]; $this->assertFalse(validator(['value' => '0'], $rule)->passes()); $this->assertFalse(validator(['value' => '1'], $rule)->passes()); $this->assertTrue(validator(['value' => '2'], $rule)->passes());}

写在最后

好吧,轮子已就位,欢迎参考。

Happy coding :-)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

转载地址:http://kowra.baihongyu.com/

你可能感兴趣的文章
结对编程1个人博客
查看>>
Octopus系列之HttpCustom2.0模板引擎的处理,一个bug的分析
查看>>
CentOS6,7不同
查看>>
@Component @Repository @Service @Controller
查看>>
C#编程(十六)----------匿名类型
查看>>
parquet文件的一些操作
查看>>
[Android Memory] App调试内存泄露之Context篇(下)
查看>>
hdu 2454 Degree Sequence of Graph G
查看>>
移动HTML5前端性能优化指南
查看>>
ubuntu install apache-php-mysql
查看>>
机器学习--线性回归
查看>>
jquery live 区别
查看>>
C++标准库简介(转)
查看>>
51nod 挑剔的美食家
查看>>
16. Vue 登录存储
查看>>
IE事件对象(The Internet Explorer Event Object)
查看>>
应用获取root权限分析及总结
查看>>
poj 2441 Arrange the Bulls (状态压缩dp+滚动数组)
查看>>
几种字符串加密解密的方法
查看>>
IT业常见职位英语缩写全攻略及详解
查看>>