Laravel添加验证场景提高针对性质的验证
laravel没有场景验证的概念,是一个验证类验证一个函数,验证数据不是很方便,封装补足一下
封装添加场景的方法
<?php
namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
use IlluminateSupportStr;
use IlluminateHttpExceptionsHttpResponseException;
use IlluminateContractsValidationValidator;
/**
* 使用方法:
* Class AbstractRequest
* @package AppHttpRequests
*/
class BaseRequest extends FormRequest
{
public $scenes = [];
public $currentScene; //当前场景
public $autoValidate = false; //是否注入之后自动验证
public function authorize()
{
return true;
}
/**
* 设置场景
* @param $scene
* @return $this
*/
public function scene($scene)
{
$this->currentScene = $scene;
return $this;
}
/**
* 覆盖自动验证方法
*/
public function validateResolved()
{
if ($this->autoValidate) {
$this->handleValidate();
}
}
/**
* 验证方法
* @param string $scene
* @throws IlluminateAuthAccessAuthorizationException
* @throws IlluminateValidationValidationException
*/
public function validate($scene = )
{
if ($scene) {
$this->currentScene = $scene;
}
$this->handleValidate();
}
/**
* 根据场景获取规则
* @return array|mixed
*/
public function getRules()
{
$rules = $this->container->call([$this, rules]);
$newRules = [];
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)) {
$newRules[$field] = $rules[$field];
}
}
return $newRules;
}
return $rules;
}
/**
* 覆盖设置 自定义验证器
* @param $factory
* @return mixed
*/
public function validator($factory)
{
return $factory->make(
$this->validationData(), $this->getRules(),
$this->messages(), $this->attributes()
);
}
/**
* 最终验证方法
* @throws IlluminateAuthAccessAuthorizationException
* @throws IlluminateValidationValidationException
*/
protected function handleValidate()
{
$instance = $this->getValidatorInstance();
if ($instance->fails()) {
$this->failedValidation($instance);
}
$this->passedValidation();
}
/**
* 重写报错部分-适应API JSON下发的需求
*/
protected function failedValidation(Validator $validator)
{
$error= $validator->errors()->all();
throw new HttpResponseException(response()->json([code=>505,msg=>$error[0],data=>[]]));
}
}
验证类的使用
<?php
namespace AppHttpRequests;
class MsgBoardRequest extends BaseRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
id=>required,
title => required|max:10,
content => required|max:255,
];
}
/**
* 获取已定义验证规则的错误消息
*
* @return array
*/
public function messages()
{
return [
id.required=>ID不能为空,
title.max =>标题太长了,简化一下吧,
title.required => 标题不能为空,
content.max => 内容太多了,
content.required => 内容不能为空,
];
}
public $scenes = [
addMsg => [title, content],
deleteMsg =>[id]
];
}
控制器中进行调用
public function addMsg(MsgBoardRequest $request){
$request->validate(addMsg);
}
public function deleteMsg(MsgBoardRequest $request){
$request->validate(deleteMsg);
}
