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加MYSQL服务器
Oct 09 PHP
php字符串截取中文截取2,单字节截取模式
Dec 10 PHP
php,ajax实现分页
Mar 27 PHP
php仿ZOL分页类代码
Oct 02 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
php ctype函数中文翻译和示例
Mar 21 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
PHP实现二维数组按某列进行排序的方法
Nov 18 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
May 12 PHP
PHP双向链表定义与用法示例
Jan 31 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执行速度全攻略(下)
2006/10/09 PHP
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
浅谈PHP中的
2016/04/23 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
php获取ip及网址的简单方法(必看)
2017/04/01 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
微信小程序 底部导航栏目开发资料
2016/12/05 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
vue自定义全局共用函数详解
2018/09/18 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
python按照多个条件排序的方法
2019/02/08 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Python连接字符串过程详解
2020/01/06 Python
Python 列表的清空方式
2020/01/13 Python
keras实现多种分类网络的方式
2020/06/11 Python
Python如何实现机器人聊天
2020/09/10 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
实习评语
2013/12/16 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
保密工作实施方案
2014/02/24 职场文书
经济管理自荐书
2014/06/09 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python