龙空技术网

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

技术铺 127

前言:

目前朋友们对“php网络验证”大致比较珍视,各位老铁们都需要分析一些“php网络验证”的相关文章。那么小编同时在网摘上收集了一些有关“php网络验证””的相关内容,希望朋友们能喜欢,兄弟们一起来了解一下吧!

laravel没有分场景表单验证概念,这点,倒比较喜欢thinkphp、yii等框架方式的,但可以实现,借助FormRequest类,创建一个基类BaseRequest来实现实现分场景方案,以下为应用总结。

1、创建带场景的表单请求验证基类

路径:app/Http/Requests/BaseRequest.php

namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;use Illuminate\Validation\ValidationException;/** * 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->autoValidate) {            $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网络验证