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一些服务器端特性的配置加强php的安全
Oct 09 PHP
PHP 5.0对象模型深度探索之对象复制
Mar 27 PHP
PHP 编程安全性小结
Jan 08 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
Jul 01 PHP
PHP获取Exif缩略图的方法
Jul 13 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
Nov 05 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
redis+php实现微博(三)微博列表功能详解
Sep 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 array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
apycom出品的jQuery精美菜单破解方法
2011/02/18 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
如何判断鼠标是否在DIV的区域内
2013/11/13 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
js轮播图无缝滚动效果
2017/06/17 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
Python3基础之函数用法
2014/08/13 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
小学学雷锋活动总结
2014/04/25 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
运动会宣传稿100字
2015/07/23 职场文书