您的位置 首页 php

php laravel8.5分场景表单验证方案

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)
    {
  }
  

本文结束,希望对大家有所帮助,感谢关注。

文章来源:智云一二三科技

文章标题:php laravel8.5分场景表单验证方案

文章地址:https://www.zhihuclub.com/149861.shtml

关于作者: 智云科技

热门文章

网站地图