转自:https://learnku.com/docs/laravel/5.4/validation/1234#custom-validation-rules

自定义验证规则

Laravel 提供了许多有用的验证规则。但你可能想自定义一些规则。注册自定义验证规则的方法之一,就是使用 Validator Facade 中的 extend 方法,让我们在 服务提供者 中使用这个方法来注册自定义的验证规则:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator; class AppServiceProvider extends ServiceProvider
{
/**
* 启动任意应用程序服务。
*
* @return void
*/
public function boot()
{
Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});
} /**
* 注册服务容器。
*
* @return void
*/
public function register()
{
//
}
}

自定义的验证闭包接收四个参数:要被验证的属性名称 $attribute,属性的值 $value,传入验证规则的参数数组 $parameters,及 Validator 实例。

除了使用闭包,你也可以传入类和方法到 extend 方法中:

Validator::extend('foo', 'FooValidator@validate');
 

自定义错误消息

另外你可能还需要为自定义规则来定义一个错误消息。这可以通过使用自定义内联消息数组或是在验证语言包中加入新的规则来实现。此消息应该被放在数组的第一级,而不是被放在 custom 数组内,这是仅针对特定属性的错误消息:

"foo" => "你的输入是无效的!",

"accepted" => ":attribute 必须被接受。",

// 其余的验证错误消息...

当你在创建自定义验证规则时,你可能需要定义占位符来取代错误消息。你可以像上面所描述的那样通过 ValidatorFacade 来使用 replacer 方法创建一个自定义验证器。通过 服务提供者 中的 boot 方法可以实现:

/**
* 启动任意应用程序服务。
*
* @return void
*/
public function boot()
{
Validator::extend(...); Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
return str_replace(...);
});
}
 

隐式扩展功能

默认情况下,若有一个类似 required 这样的规则,当此规则被验证的属性不存在或包含空值时,其一般的验证规则(包括自定扩展功能)都将不会被运行。例如,当 integer 规则的值为 null 时 unique 将不会被运行:

$rules = ['name' => 'unique'];

$input = ['name' => null];

Validator::make($input, $rules)->passes(); // true

如果要在属性为空时依然运行此规则,则此规则必须暗示该属性为必填。要创建一个「隐式」扩展功能,可以使用 Validator::extendImplicit() 方法:

Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});

{note} 一个「隐式」扩展功能只会 暗示 该属性为必填。它的实际属性是否为无效属性或空属性主要取决于你。

最新文章

  1. PyQt4入门学习笔记(一)
  2. AS3中 Event 类的target和currentTarget属性
  3. 【SharePoint学习笔记】第4章 SharePoint UI 定制
  4. iazq更新网址
  5. 多线程调用HttpWebRequest并发连接限制
  6. [ActionScript 3.0] Away3D 官网实例
  7. 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下
  8. 大端小端(Big- Endian和Little-Endian)[转]
  9. 【转载】Git的安装与使用
  10. log4net封装类 zz
  11. [Effective Modern C++] Item 1. Understand template type deduction - 了解模板类型推断
  12. WinForm中快捷键与组合按键的设置方法
  13. 自动安装L2tp的脚本
  14. Mongodb复杂查询,总结
  15. angular懒加载
  16. 修改iptables后重启返回错误
  17. Before NOIP 2018
  18. Android 播放Gif 动画
  19. iOS上传本地代码到git
  20. 使用LTP套件对Linux系统进行压力测试

热门文章

  1. Socket通讯-C#客户端与Java服务端通讯(发送消息和文件)
  2. 45. Jump Game II (JAVA)
  3. 已知链表头结点指针head,写一个函数把这个链表逆序
  4. WPF游戏,使用move游戏开发
  5. Oracle锁表信息处理步骤
  6. Myabtis中批量更新update多字段
  7. CentOS7 编译安装python3.6.8(升级python)
  8. GUI学习之二十七——布局管理学习总结
  9. Linux下配置静态IP地址,设置DNS和主机名
  10. java:集合输出之Iterator和ListIterator