参数校验是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测试结果如下:
在上面的代码中,UserController的校验工作都在UserRequest文件中完成。