参数校验是web开发中不可或缺的一部分,因为用户的提交信息不可信或者用户提交一些不符合条件的数据,有可能对我们的系统安全造成一定的影响,所以需要对用户的输入信息进行参数校验。

在Laravel中如何做参数校验呢?我们可以使用Laravel的请求校验工具,通过Laravel校验工具的一些内置校验方法,我们可以对字段校验是否为空、数据类型、字符串长度、邮箱等。

下面介绍Laravel的校验工具的使用方法。

简单校验

为了说明这一功能,我们在routes/api.php创建一个简单的路由,表示新增用户,如下:

Route::match('post','/user/add','App\Http\Controllers\Api\UserController@add');

接下来,在命名空间 App\Http\Api\Controllers下创建一个UserController的控制器,我们使用Validator::make()方法校验,建议使用validator::make()方法省去不必要的麻烦。

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class UserController extends Controller {

    public function add(Request $request) {
        $rules = array(
            'username'   => 'required|max:255|min:3',
            'password'   => 'required'
        );
        $message = array(
            "required"   => ":attribute 不能为空",
            "max"        => ":attribute 长度不能超过255",
            "min"        => ":attribute 长度不能小于3"
        );
        $attributes = array(
            "username"     => '用户名',
            "password"     => '密码'
        );
        $data = $request->all();
        $validator = Validator::make($data, $rules, $message, $attributes);
        if ($validator->fails()) {
            $errors = $validator->getMessageBag()->toArray();
            $errStr = "";
            foreach ($errors as $errorList) {
                foreach($errorList as $error){
                    $errStr .= $error . "\n";
                }
            }

            //自定义返回
            return response()->json(array(
                'msg' => $errStr,
                'code' => 500
            ));
        }
    }
}
虽然上面的代码能完成我们的需求,但是校验和控制器代码没有解耦,随着项目的逐渐复杂,代码可读性会变差,接下来介绍一种更好的方法解决Laravel的参数校验。

校验解耦-自定义校验

在Laravel中可以创建自定义校验类,并将这个校验类注入的Laravel的控制器的参数中,这也是Laravel的特性之一,依赖注入。

下面我们来拆解上面的例子。

控制器代码 UserController.php

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller {

    public function add(UserRequest $request) {

       //... 自己的业务

    }
}
自定义校验类UserRequest.php
<?php

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Contracts\Validation\Validator;

class UserRequest extends FormRequest {

    public function rules(){
        return [
            'username' => 'required|max:255',
            'password' => 'required',
        ];
    }

    public function failedValidation(Validator $validator){
        $errors = $validator->getMessageBag()->toArray();
        $errStr = "";
        foreach ($errors as $errorList) {
            foreach($errorList as $error){
                $errStr .= $error . "\n";
            }
        }
        throw new HttpResponseException(response()->json([
                'msg' => $errStr,
                'code' => 500
        ]));
    }

    public function messages() {
        return [
            'username.required' => ':attribute 不能空',
            'password.required' => ':attribute 不能空'
        ];
    }

    public function attributes() {
        return [
            'username' => '用户名',
            'password' => '密码'
        ];
    }

}

使用postman测试结果如下:

Laravel 参数校验

在上面的代码中,UserController的校验工作都在UserRequest文件中完成。