Laravel学习教程之model validation的使用示例


Posted in PHP onOctober 23, 2017

前言

本文主要给大家介绍了关于Laravel学习之model validation使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

在对database进行写操作前,需要对数据进行validation,如type-check 每一个 model column 的定义('type' 这个column必须是enum('card','loan')) ,这里使用model event来做。

在EventServiceProvider(或自定义一个ValidationServiceProvider)中写上:

public function boot()
{
  /**
   * Inspired by @see \Illuminate\Foundation\Providers\FormRequestServiceProvider::boot()
   *
   * Note: saving event is always triggered before creating and updating events
   */
  $this->app['events']->listen('eloquent.saving: *', function (string $event_name, array $data): void {
   /** @var \App\Extensions\Illuminate\Database\Eloquent\Model $object */
   $object = $data[0];
   
   $object->validate();
  });
}

'eloquent.saving: *'是表示listen所有model的saving,即任何一个model的写操作都会触发该事件。

然后写一个abstract model extends EloquentModel:

// \App\Extensions\Illuminate\Database\Eloquent\Model

use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Validation\ValidationException;

abstract class Model extends EloquentModel
{
 public function validate():void
 {
  // 1. validate type rules (type-check)
  $validator = $this->getTypeValidator();
  
  if ($validator->fails()) {
   throw new ValidationException($validator);
  }
  
  // $validator = $this->getConstraintValidator();
  // 2. validate constraint rules (sanity-check)
 }

 protected function getTypeValidator()
 {
  return $this->getValidationFactory()->make($this->attributes, static::COLUMN_TYPE_RULES);
 }
 
 protected function getValidationFactory()
 {
  return app(Factory::class);
 }
 
 protected function getConstraintValidator()
 {
  // return $this->getValidationFactory()->make($attributes, static::COLUMN_CONSTRAINT_RULES);
 } 
}

这样,在每一个继承abstract model的子类中,定义const COLUMN_TYPE_RULES就行,如:

class Account extends Model
{
 public const COLUMN_TYPE_RULES = [
  'id' => 'integer|between:0,4294967295',
  'source' => 'nullable|in:schwab,orion,yodlee',
  'type' => 'required|in:bank,card,loan',
 ];
}

在写操作时,提前对每一个 model 的 schema definition进行type-check,避免无效碰撞 database。这个feature的目的是从model schema去校验输入数据的字段定义是否合法。

另外一般除了type-check schema definition 外,还得根据业务需要进行逻辑校验sanity-check constraint rules,如当创建一个account时,输入inputs里的字段person_id不能是child未成年人,等等。这里业务不同,constraint rules不同,不做过多解释。这个feature的目的主要是从逻辑上校验输入数据的合法性。

OK,总之一般情况下,在写数据库前都需要做 model validation,避免无效hit db。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP 和 MySQL 开发的 8 个技巧
Oct 09 PHP
php magic_quotes_gpc的一点认识与分析
Aug 18 PHP
php抓取https的内容的代码
Apr 06 PHP
浅析php工厂模式
Nov 25 PHP
Symfony2安装第三方Bundles实例详解
Feb 04 PHP
详解PHP文件的自动加载(autoloading)
Feb 04 PHP
PHP接入微信H5支付的方法示例
Oct 28 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 PHP
PHP中多字节字符串操作实例详解
Aug 23 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 #PHP
利用PHP获取汉字首字母并且分组排序详解
Oct 22 #PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 #PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 #PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 #PHP
php+ajax实现仿百度查询下拉内容功能示例
Oct 20 #PHP
详解cookie验证的php应用的一种SSO解决办法
Oct 20 #PHP
You might like
php 正则匹配函数体
2009/08/25 PHP
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
详解js异步文件加载器
2016/01/24 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
2016/01/26 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
Django自定义认证方式用法示例
2017/06/23 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
Python3.7 dataclass使用指南小结
2019/02/22 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
web页面录屏实现
2019/02/12 HTML / CSS
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
致地震灾区的慰问信
2015/03/23 职场文书
户外拓展训练感想
2015/08/07 职场文书
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android
使用Python开发贪吃蛇游戏 SnakeGame
2022/04/30 Python
Nginx 匹配方式
2022/05/15 Servers
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server