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 相关文章推荐
打造计数器DIY三步曲(上)
Oct 09 PHP
php中如何同时使用session和cookie来保存用户登录信息
Jul 05 PHP
php检测文件编码的方法示例
Apr 25 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
PHP模拟post提交数据方法汇总
Feb 16 PHP
php使用curl详细解析及问题汇总
Aug 11 PHP
php 数组处理函数extract详解及实例代码
Nov 23 PHP
PHP图片水印类的封装
Jul 06 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
Laravel 添加多语言提示信息的方法
Sep 29 PHP
eval(cmd)与eval($cmd)的区别与联系
Jul 07 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
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
php对象工厂类完整示例
2018/08/09 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
列表内容的选择
2006/06/30 Javascript
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
js返回顶部实例分享
2016/12/21 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
2019/05/15 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
python列表操作实例
2015/01/14 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
会计专业毕业生推荐信
2013/11/05 职场文书
品质主管岗位职责
2014/03/16 职场文书
文化产业实施方案
2014/06/07 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
售后服务承诺函格式
2015/01/21 职场文书
辞职信如何写
2015/02/27 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
公司转让协议书
2016/03/19 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python