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获取远程图片并把它保存到本地的代码
Apr 07 PHP
php知道与问问的采集插件代码
Oct 12 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
解析ajax事件的调用顺序
Jun 17 PHP
在win7中搭建Linux+PHP 开发环境
Oct 08 PHP
Yii实现MySQL多数据库和读写分离实例分析
Dec 03 PHP
PHP5多态性与动态绑定介绍
Apr 03 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
PHP实现cookie跨域session共享的方法分析
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数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
使用正则替换变量
2007/05/05 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
学习Django知识点分享
2019/09/11 Python
python之yield和Generator深入解析
2019/09/18 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
python 穷举指定长度的密码例子
2020/04/02 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
人力资源职位说明书
2014/07/29 职场文书
统计员岗位职责
2015/02/11 职场文书
Nginx进程调度问题详解
2021/09/25 Servers
中国十大神话动漫电影排行榜 哪吒登顶 白蛇缘起排第七
2022/03/21 国漫