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 协议》,转载必须注明作者和本文链接
坚信技术改变世界,改变人生,改善个人生活。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7

这种写法一言难尽,但是我饿了,我不做评论,我吃饭去了

4年前 评论

我自己的项目一般会有 Request 层,来进行验证数据

4年前 评论

@L学习不停 这种写法是有什么不当是么 请指教

4年前 评论
L学习不停 4年前
Gxpro 4年前
fengzb (作者) (楼主) 4年前
fengzb (作者) (楼主) 4年前

你难道不知道有request这种东西的吗

4年前 评论

@pigzzz 现在知道了 :joy:,多谢多谢

4年前 评论

@fengzb

1.session重新打开浏览器不失效,laravel的默认机制是这样的,见config/session.php

file

4年前 评论
fengzb (楼主) 4年前

相比request层做验证,这种方式更加灵活。一个场景是:用户提交数据不一定来自表单,比如用户提交导入文件的方式来插入数据,那么此时应该如何做参数校验呢?这种情况下使用model层做验证无疑是正确的方法, 不仅能应对来自request 的参数也可以处理 来自于导入文件的参数。

参数验证模块之所以设计validator类,而不是直接将验证逻辑放到request中,就是这个想法:虽然多数情况下是在request中实现验证,但是不排除有特殊情况,此时则需要你手动调用validator类来实现验证。本质上参数验证的对象是一个抽象的表单,但是和表单来源(Request、导入文件或者其他)无关。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!