Laravel-validate 后端用户提交数据验证研究 写到 model 层的实践
一时兴起想到后端用户提交数据验证部分代码应该写到控制器里面还是model里面,网上说什么的都有,我就想什么都写到控制里那么model层写点什么?废话不多说直接呈现代码,这是我把验证部分写到model的实例希望能帮助到大家,大家如果有更好的写法可以交流分享一下共同进步。
model代码如下
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Validator;
class Books extends Model
{
// 定义表名
protected $table = 'books';
// 定义主键
protected $primaryKey = 'book_id';
// 是否自动维护 添加/最后修改时间
public $timestamps = true;
// 定义验证规则
protected $validate = [
'rules'=>[
'book_name'=>['required','string'],
'book_writer'=>['required','string'],
'book_cover'=>['required','string'],
'book_desc'=>['required','string'],
'category_id'=>['integer'],
],
'messages'=>[
'required'=>':attribute 必填项',
'string'=>':attribute 必须是字符串类型',
'integer'=>':attribute 必须是数字类型'
],
'custom'=>[
'book_name'=>'小说名称',
'book_writer'=>'作者',
'book_cover'=>'封面',
'book_desc'=>'小说简介',
'category_id'=>'分类'
]
];
// 表单验证并插入或者修改数据
public function check_params($params)
{
// 创建验证器
$validator = Validator::make($params,$this->validate['rules'],$this->validate['messages'],$this->validate['custom']);
// 开始验证 有错误自动返回到表单页面
return $validator->validate();
}
}
控制器代码如下
// 添加小说
public function add(Request $request){
if($request->isMethod('post')){
$bookModel = new Books();
$params = $request->post();
// 验证用户提交数据
$bookModel->check_params($params);
// 继续处理 写入数据库
$bookModel->book_name = trim($params['book_name']);
$bookModel->book_writer = trim($params['book_writer']);
$bookModel->book_cover = trim($params['book_cover']);
$bookModel->book_desc = trim($params['book_desc']);
$bookModel->category_id = intval($params['category_id']);
$bookModel->status = intval($params['status']);
$bookModel->uid = Auth::user()->getAuthIdentifier();
$rt = $bookModel->save();
if($rt) {
redirect(route('myshare',Auth::user()->getAuthIdentifier()));
}
} else {
$allCates = Categorys::where('status','=',1)
->select(['id','category_name'])
->get();
return view('member.share.add')->with(['categorys'=>$allCates]);
}
}
view视图层代码如下
@if ($errors->any())
<div class="layui-bg-red">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
本作品采用《CC 协议》,转载必须注明作者和本文链接
这种写法一言难尽,但是我饿了,我不做评论,我吃饭去了
我自己的项目一般会有 Request 层,来进行验证数据
@L学习不停 这种写法是有什么不当是么 请指教
你难道不知道有request这种东西的吗
@pigzzz 现在知道了 :joy:,多谢多谢
@fengzb
1.session重新打开浏览器不失效,laravel的默认机制是这样的,见
config/session.php
相比request层做验证,这种方式更加灵活。一个场景是:用户提交数据不一定来自表单,比如用户提交导入文件的方式来插入数据,那么此时应该如何做参数校验呢?这种情况下使用model层做验证无疑是正确的方法, 不仅能应对来自request 的参数也可以处理 来自于导入文件的参数。
参数验证模块之所以设计validator类,而不是直接将验证逻辑放到request中,就是这个想法:虽然多数情况下是在request中实现验证,但是不排除有特殊情况,此时则需要你手动调用validator类来实现验证。本质上参数验证的对象是一个抽象的表单,但是和表单来源(Request、导入文件或者其他)无关。