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中读取和写入WORD文档的代码
Apr 09 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
php动态添加url查询参数的方法
Apr 14 PHP
你应该知道PHP浮点数知识
May 13 PHP
phalcon框架使用指南
Feb 23 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
基于php编程规范(详解)
Aug 17 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 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/11/23 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
PHP实现图片压缩
2020/09/09 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
Js组件的一些写法
2010/09/10 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
微信小程序官方动态自定义底部tabBar的例子
2019/09/04 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
python中的字符串内部换行方法
2018/07/19 Python
python修改txt文件中的某一项方法
2018/12/29 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
简单了解django缓存方式及配置
2019/07/19 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
公司授权委托书
2014/10/17 职场文书
个人务虚会发言材料
2014/10/20 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
作文之亲情600字
2019/09/23 职场文书
golang json数组拼接的实例
2021/04/28 Golang
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis