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学习笔记之面向对象编程
Dec 29 PHP
解析php防止form重复提交的方法
Jul 01 PHP
codeigniter中测试通过的分页类示例
Apr 17 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
Laravel框架实现发送短信验证功能代码
Jun 06 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
Zend Framework数据库操作技巧总结
Feb 18 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 PHP
php swoft框架实例用法
Dec 22 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连mysql和oracle数据库性能比较
2006/10/09 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
ThinkPHP中Session用法详解
2014/11/29 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
JavaScript实现窗口抖动效果
2016/10/19 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
Angularjs按需查询实例代码
2017/10/30 Javascript
JavaScript 下载svg图片为png格式
2018/06/21 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
python3字符串操作总结
2019/07/24 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
实习期自我鉴定
2013/10/11 职场文书
前台接待的工作职责
2013/11/21 职场文书
优秀通讯员事迹材料
2014/01/28 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js