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中的字符串函数
Oct 09 PHP
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
Feb 22 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
Oct 22 PHP
php 无极分类(递归)实现代码
Jan 05 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
Nov 07 PHP
PHP删除数组中的特定元素的代码
Jun 28 PHP
PHP 文件系统详解
Sep 13 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
Dec 14 PHP
yii分页组件用法实例分析
Dec 28 PHP
php array_keys 返回数组的键名
Oct 25 PHP
php redis setnx分布式锁简单原理解析
Oct 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
PHP Mysql编程之高级技巧
2008/08/27 PHP
php中字符串和正则表达式详解
2014/10/23 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
2015/06/10 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
jquery 入门教程 [翻译] 推荐
2009/08/17 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
动态加载js和css(外部文件)
2013/04/17 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
2016/04/29 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
用python实现百度翻译的示例代码
2018/03/09 Python
Python DataFrame 设置输出不显示index(索引)值的方法
2018/06/07 Python
Django框架模板的使用方法示例
2019/05/25 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
通过python检测字符串的字母
2020/02/18 Python
美国沃尔玛网上超市:Walmart
2020/08/14 全球购物
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
大学校运会广播稿
2014/02/03 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
学校安全责任书范本
2014/07/23 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL