thinkphp5.1+ 表單驗證(驗證器)自定義驗證方法
阿新 • • 發佈:2018-12-19
TP5.1+ 中的驗證器,個人覺得就是 Laravel/Lumen 或是 CodeIgniter 中的表單驗證.
1. 驗證器
我們可以用以下指令快速生成驗證器
php think make:validate dev/Test
以下是我生成的 User 驗證器示例
<?php /** * Created by PhpStorm. * User: nwei * Date: 2018/10/16 * Time: 15:25 * * .--, .--, * ( ( \.---./ ) ) * '.__/o o\__.' * {= ^ =} * > - < * / \ * // \\ * //| . |\\ * "'\ /'"_.-~^`'-. * \ _ /--' ` * ___)( )(___ * (((__) (__))) 高山仰止,景行行止.雖不能至,心嚮往之. * */ namespace app\dev\validate; use think\Db; use think\Validate; class User extends Validate { protected $rule = [ 'name' => 'require|max:25|checkName:使用者名稱不能為123', 'nickname' => 'require' ]; protected $message = [ 'name.require' => '名稱不能為空', 'name.max' => '名稱最少為25個字元', 'nickname.require' => 'nickname不能為空' ]; // 自定義驗證規則 protected function checkName($value,$rule,$data=[],$name,$description){ if ($value == '123'){ return $rule; }else{ return true; } } }
使用示例:
在控制器有一個如下方法,
public function curlAddUser(Request $request){ $data = [ 'name' => $request->post('name'), 'nickname' => $request->post('nickname') ]; $validate = new \app\dev\validate\User(); if (!$validate->check($data)){ return ($validate->getError()); } }
利用 postman 請求結果如下
如果需要批量驗證,可以加上 batch() 方法,改成如下示例
public function curlAddUser(Request $request){ $data = [ 'name' => $request->post('name'), 'nickname' => $request->post('nickname') ]; $validate = new \app\dev\validate\User(); if (!$validate->batch()->check($data)){ dump($validate->getError()); } }
2. 獨立驗證
我們在控制器中新加 curlAddUser2() 方法探索獨立驗證.可以使用 extend 方法動態註冊驗證規則
public function curlAddUser2(Request $request){
$rule = [
'name' => 'require|max:25|checkName:你不是公孫勝',
'nickname' => 'require'
];
$msg = [
'name.require' => '名稱不能為空',
'name.max' => '名稱最多不能超過25個字元',
'nickname' => 'nickname 不能為空'
];
Validate::extend('checkName',function ($value,$rule){
if ($value != '公孫勝'){
return $rule;
}else{
return true;
}
});
$data = [
'name' => 'xx公孫勝',
'nickname' => ''
];
$validate = Validate::make($rule,$msg);
$result = $validate->batch()->check($data);
if (!$result){
dump($validate->getError());
}
}
示例結果