Lumen企业站内容管理实战 - 文章分类模块的数据验证

文章分类模块的数据验证

 前边做了文章分类的添加、编辑等,但是对于前端提交的数据没有做过任何的验证,这个是不安全的,对于任何提交的信息,后端都应该做检查,所以要做一个数据验证,lumen的数据验证和laravel基本一样,但是用法稍微有点区别,我们这里介绍lumen的数据验证。

为了保持控制器不过于臃肿,我们把数据验证独立出来,所有的数据验证逻辑都放到/app/Http/Requests/目录,Requests目录需要你新建,lumen框架中没有自带这个目录,建立这个目录也是为了和laravel保持一致。

为了便于对验证文件的管理和分类,需要在Requests目下,再建立一个Admin目录,总的路径是:/app/Http/Requests/Admin/,如下

在Admin目录下,我再建立一个Category目录,Category目录下都是分类的数据验证文件

在Category目录下,我们新建一个对新增分类做数据验证的文件AddCategory.php

 

<?php


namespace App\Http\Requests\Admin\Category;


class AddCategory
{
    static public function rules()
    {
        return [];
    }

    static public function msg()
    {
        return [];
    }

    static public function attr()
    {
        return [];
    }
}

有三个方法,都返回数组。第一个方法rules()是验证规则,第二个msg()是出发规则后提示的信息,第三个attr()是被验证字段的说明。

这个类是被CategoryController.php文件用的,从名字上看,这个验证文件是对新增数据做验证,所以,看代码

class CategoryController extends Controller
{

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \Illuminate\Validation\ValidationException
     */
    public function add(Request $request)
    {


        // 判断不是不post方式提交数据
        if ($request->post()) {

            // 对新增数据做验证
            $this->validate($request, AddCategory::rules(), AddCategory::msg(), AddCategory::attr());

            // 添加分类
            Category::add($request->input());
            return $this->response->responseJSON();
        }

        return view('admin.category.addCategory');

    }
}

代码
 

$this->validate($request, AddCategory::rules(), AddCategory::msg(), AddCategory::attr());

第一个参数,是固定的,这个变量里边有前端提交的数据,第二是规则,第三个提示信息,第四个是给字段定义的属性。
现在还不能验证数据,因为规则还没有做好,我们把规则加上去。

<?php
/**
 * Created by PhpStorm.
 * User: Admin
 * Date: 2020/1/2
 * Time: 14:45
 */

namespace App\Http\Requests\Admin\Category;


class AddCategory
{
    static public function rules()
    {
        return [
            'type' => 'required|in:1,2',
            'name' => 'required|string|max:20',
            'dir_name' => 'required|alpha|max:20',
            'pic' => 'string|max:50',
            'is_nav' => 'required|in:0,1',
        ];
    }

    static public function msg()
    {
        return [
            'type.required' => '类型不能为空',
            'type.in' => '类型错误',

            'name.required' => '分类名称必填',
            'name.string' => '分类名称必须是字符串类型',
            'name.max' => '分类名称不能超过20个字符',

            'dir_name.required' => '目录名必填',
            'dir_name.alpha' => '目录名必须都字母',
            'dir_name.max' => '目录名不能超过20个字符',

            'pic.string' => '图片地址必须是字符串',
            'pic.max' => '图片地址不能超过50个字符',


            'is_nav.required' => '是否作为导航不能为空',
            'is_nav.in' => '是否作为导航错误',


        ];
    }

    static public function attr()
    {
        return [];
    }
}

rules()方法中,=>左边的是被验证的字段,右边的是对左边的type做什么样的验证规则,每个规则用竖线“|”分隔。

'type' => 'required|in:1,2',

对type做验证,required规则代表type字段不能缺少,in:1,2规则代表type字段的值必须是1和2,不能是其它值,否则触发规则。

'name' => 'required|string|max:20',

对name字段做验证,name必填,必须是字符串,字符串的长度最大是20。

'dir_name' => 'required|alpha|max:20',

对dir_name做验证,dir_name必填,alpha规则要求必须全部是字母,字符串长度最大是20。

'pic' => 'string|max:50',

对pic做验证,pic可以为空,但是如果不为空时,pic必须是字符串切长度最大是50。

'is_nav' => 'required|in:0,1',

对is_nav做验证,is_nav必传,且值必须是0和1。

msg()方法中,是对触发规则后应该提示什么信息做的定义。

'type.required' => '类型不能为空',

该行代码说明,如果前端没有提交type字段或者type字段的值是空,则提示‘类型不能为空’

'type.in' => '类型错误',

该行代码说明,如果前端提交的数据不是1或者2,那么提示类型错误

'name.max' => '分类名称不能超过20个字符',

该行代码说明,如果前端提交的name值的长度超过20个,那么提示‘分类名称不能超过20个字符’

其它的不再解释了,道理一样。我们用postman测试下看看。

触发了规则,控制器中的代码不会往下执行,除非提交的数据完全符合规则。但是前边我们也说了,服务器端返回的接口类型是有固定规则的,这个接口返回的json格式不符合规则,所以,我们要处理下,处理成,当触发规则后,提示我们要求的json格式数据。我们要改点东西了。

打开/app/Exceptions/Handler.php文件,在render()方法中,加入代码

    public function render($request, Exception $exception)
    {

        $response = new Response();

        //数据验证异常拦截
        $classException = get_class($exception);

        if ($classException == ValidationException::class) {
            // 返回所有错误信息
            if ($exception instanceof \Illuminate\Validation\ValidationException) {


                $response->setMsg(422, array_values($exception->validator->errors()->toArray())[0][0]);
                return $response->responseJSON();
            }
        }

        return parent::render($request, $exception);
    }

然后再通过postman请求接口看看

 看起作用了,其它几个接口的验证也是一样的,验证规则,你们就看laravel的验证规则吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangpeng52758

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值