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 裁剪图片成固定大小代码方法
Sep 09 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
PHP实现根据银行卡号判断银行
Apr 29 PHP
php根据用户语言跳转相应网页
Nov 04 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
Sep 11 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 PHP
PHP空值检测函数与方法汇总
Nov 19 PHP
Laravel框架实现超简单的分页效果示例
Feb 08 PHP
thinkphp5使用无限极分类
Feb 18 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
我的论坛源代码(五)
2006/10/09 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
jquery animate 动画效果使用说明
2009/11/04 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python基于右递归解决八皇后问题的方法
2015/05/25 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
实用自动化运维Python脚本分享
2018/06/04 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
python实现三种随机请求头方式
2021/01/05 Python
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
便利店投资的创业计划书
2014/01/12 职场文书
二手书店创业计划书
2014/01/16 职场文书
导购员的岗位职责
2014/02/08 职场文书
设备售后服务承诺书
2014/05/30 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang