laravel 没有分场景表单验证概念,这点,倒比较喜欢 thinkphp 、yii等框架方式的,但可以实现,借助Form Request 类,创建一个基类BaseRequest来实现实现分场景方案,以下为应用总结。
1、创建带场景的表单请求验证基类
路径:app/Http/Requests/BaseRequest.php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validation Exception ;
/**
* Class BaseRequest 带场景的表单请求验证基类
* @package App\Http\Requests
*/
class BaseRequest extends FormRequest
{
/**
* 多场景设置
* @var array
* 例:
* $scenes = [
* 'store' => ['title','content'],
* 'update' => ['id','title','content'],
* 'destroy' => ['id'],
* ]
*/
protected $scenes = [];
/**
* 注入表单请求验证时自动校验
*
* @var bool
*/
public $autoValidate = false;
/**
* 当前场景
* @var string
*/
protected $currentScene = '';
/**
* 用户是否拥有操作权限:true是,false否
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* 重置自动验证
*
* @throws ValidationException
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function validateResolved()
{
if ($this->auto Validate ) {
$this->handleValidate();
}
}
/**
* 获取场景验证规则
* @return array|mixed
*/
public function getRules()
{
$rules = $this->container->call([$this, 'rules']);
$sceneRules = [];
if ($this->currentScene && isset($this->scenes[$this->currentScene])) {
$sceneFields = is_array($this->scenes[$this->currentScene])
? $this->scenes[$this->currentScene] : explode(',', $this->scenes[$this->currentScene]);
foreach ($sceneFields as $field) {
if (array_key_ exists ($field, $rules)) {
$sceneRules[$field] = $rules[$field];
}
}
return $sceneRules;
}
return $rules;
}
/**
* 覆盖验证器
* @param $factory
* @return mixed
*/
public function validator($factory)
{
return $factory->make(
$this->validationData(), $this->getRules(),
$this->messages(), $this->attributes()
);
}
/**
* 应用时调用的验证方法
* @param string $scene
* @return array| void
* @throws \Illuminate\Auth\Access\AuthorizationException
* @throws \Illuminate\Validation\ValidationException
*/
public function validate($scene = '')
{
if (!empty($scene)) {
$this->currentScene = $scene;
}
$this->handleValidate();
}
/**
* 实际执行的验证方法
* @throws \Illuminate\Auth\Access\AuthorizationException
* @throws \Illuminate\Validation\ValidationException
*/
protected function handleValidate()
{
$instance = $this->getValidatorInstance();
if ($instance->fails()) {
$this->failedValidation($instance);
}
$this->passedValidation();
}
}
2、创建一个模型的验证类演示demo
路径:app/Http/Requests/DemoRequest.php
/**
* Class DemoRequest 表单请求验证演示类
* @package App\Http\Requests
*/
class DemoRequest extends BaseRequest
{
/**
* 注入表单请求验证时自动校验
*
* @var bool
*/
public $autoValidate = false;
/**
* 用户是否有权操作,true是,false否
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* 字段验证规则
*
* @return array
*/
public function rules()
{
return [
'id' => 'required',
'title' => 'required|max:10',
'content' => 'required|max:255',
];
}
/**
* 提示信息
*
* @return array
*/
public function messages()
{
return [
];
}
/**
* 定义场景
*
* @var \string[][]
*/
public $scenes = [
'store' => ['title', 'content'],
'update' => ['id', 'title', 'content'],
'destroy' => ['id'],
];
/**
* 验证错误的自定义属性
*
* @return array
*/
public function attributes()
{
return [
'id' => 'ID',
'title' => '标题',
'content' => '内容'
];
}
/**
* 验证前
*
* @return void
*/
protected function prepareForValidation()
{
}
}
3、控制器中应用
// 1、分场景验证
// 需要DemoRequest中 设置 public $autoValidate = false;
// 控制器中应用
public function store(DemoRequest $request)
{
$request->validate('store');
}
// 2、不分场景验证
// 需要DemoRequest中 设置 public $autoValidate = true;
// 控制器中应用:注入时自动验证
public function store(DemoRequest $request)
{
}
本文结束,希望对大家有所帮助,感谢关注。