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的输入输出流
Feb 14 PHP
简单的php 验证图片生成函数
May 21 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
php使用ereg验证文件上传的方法
Dec 16 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
May 11 PHP
老生常谈PHP面向对象之解释器模式
May 17 PHP
PHP实现微信退款的方法示例
Mar 26 PHP
有关PHP 中 config.m4 的探索
Aug 26 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
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JavaScript 事件参考手册
2008/12/24 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
深入理解与使用keep-alive(配合router-view缓存整个路由页面)
2018/09/25 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python实现字符串格式化输出的方法详解
2017/09/20 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
优秀学生干部个人的自我评价
2013/10/04 职场文书
行政助理的职责
2013/11/14 职场文书
毕业证丢失证明
2014/01/15 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
工作简历的自我评价
2019/05/16 职场文书
python实现图片批量压缩
2021/04/24 Python