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下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
php adodb分页实现代码
Mar 19 PHP
CodeIgniter模板引擎使用实例
Jul 15 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
PHP中的一些常用函数收集
May 26 PHP
Yii2中关联查询简单用法示例
Aug 10 PHP
thinkPHP线上自动加载异常与修复方法实例分析
Dec 01 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
May 30 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
跟老齐学Python之Python安装
2014/09/12 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
Python底层封装实现方法详解
2020/01/22 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
党校学习自我鉴定
2014/02/24 职场文书
物流管理专业求职信
2014/05/29 职场文书
个性车贴标语
2014/06/24 职场文书
2015年教研工作总结
2015/05/23 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers