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 Ajax实现页面无刷新发表评论
Jan 02 PHP
PHP使用Pthread实现的多线程操作实例
Nov 14 PHP
CodeIgniter分页类pagination使用方法示例
Mar 28 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 PHP
PHP7多线程搭建教程
Apr 21 PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 PHP
PHP asXML()函数讲解
Feb 03 PHP
详解no input file specified 三种解决方法
Nov 29 PHP
PHP中用Trait封装单例模式的实现
Dec 18 PHP
PHP dirname(__FILE__)原理及用法解析
Oct 28 PHP
PHP的imageTtfText()函数深入详解
Mar 03 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
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
基于vue.js无缝滚动效果
2018/01/25 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
python定时关机小脚本
2018/06/20 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
python实现生成Word、docx文件的方法分析
2019/08/30 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Tensorflow 多线程设置方式
2020/02/06 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
处理textarea中的换行和空格
2019/12/12 HTML / CSS
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
教师实习自我鉴定
2013/12/14 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
胡桃夹子观后感
2015/06/11 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
python识别围棋定位棋盘位置
2021/07/26 Python