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为表单获取的URL 地址预设 http 字符串函数代码
May 26 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
php专用数组排序类ArraySortUtil用法实例
Apr 03 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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横向重复区域显示二法
2008/09/25 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
Python兔子毒药问题实例分析
2015/03/05 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
教师找工作推荐信
2013/11/23 职场文书
暑期实习鉴定
2013/12/16 职场文书
工程项目建议书范文
2014/03/12 职场文书
合作协议书范本
2014/04/17 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
企业2014年度工作总结
2014/12/10 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书