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);
}
经验分享 程序员 微信小程序 职场和发展