教你修改Laravel FormRequest验证,实现场景验证

2022-05-15 0 786

下面由Laravel教程栏目给大家介绍修改Laravel FormRequest验证,实现场景验证,希望对需要的朋友有所帮助!

教你修改Laravel FormRequest验证,实现场景验证

在Laravel 中,很多创建和编辑的的接口都是需要做数据验证的,对于数据验证一般有2种方方式

在控制器里直接使用Request的validate方法

使用自定义FormRequest类,该类集成自Http\\Request

如果使用第一种方法,会比较乱,看起来不够优雅

但是如果使用第二种方式,那么针对每一种请求都要定义一个FormRequest

比如:ArticleStoreRequestArticleUpdateRequest

但是你会发现基本上验证规则是一样的,当然你可以在控制器方法里只注入一个Request,但是如果针对于一个Model 有多个Update的那种,比如用户模块,修改密码/修改昵称/修改头像/修改地址/修改。。。怎么处理呢

所以这几天针对这种情况,改进了下Laravel的Request机制,加了一个场景验证

第一步:先创建一个AbstractRequest的基类

<?phpnamespace App\\Http\\Requests;use Illuminate\\Foundation\\Http\\FormRequest;use Illuminate\\Support\\Str;/** * 使用方法: * Class AbstractRequest * @package App\\Http\\Requests */class AbstractRequest extends FormRequest{    public $scenes = [];    public $currentScene;               //当前场景    public $autoValidate = false;       //是否注入之后自动验证    public $extendRules;    public function authorize()    {        return true;    }    /**     * 设置场景     * @param $scene     * @return $this     */    public function scene($scene)    {        $this->currentScene = $scene;        return $this;    }    /**     * 使用扩展rule     * @param string $name     * @return AbstractRequest     */    public function with($name = '')    {        if (is_array($name)) {            $this->extendRules = array_merge($this->extendRules[], array_map(function ($v) {                return Str::camel($v);            }, $name));        } else if (is_string($name)) {            $this->extendRules[] = Str::camel($name);        }        return $this;    }    /**     * 覆盖自动验证方法     */    public function validateResolved()    {        if ($this->autoValidate) {            $this->handleValidate();        }    }    /**     * 验证方法     * @param string $scene     * @throws \\Illuminate\\Auth\\Access\\AuthorizationException     * @throws \\Illuminate\\Validation\\ValidationException     */    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->extendRules) {            $extendRules = array_reverse($this->extendRules);            foreach ($extendRules as $extendRule) {                if (method_exists($this, "{$extendRule}Rules")) {   //合并场景规则                    $rules = array_merge($rules, $this->container->call(                        [$this, "{$extendRule}Rules"]                    ));                }            }        }        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 \\Illuminate\\Auth\\Access\\AuthorizationException     * @throws \\Illuminate\\Validation\\ValidationException     */    protected function handleValidate()    {        if (!$this->passesAuthorization()) {            $this->failedAuthorization();        }        $instance = $this->getValidatorInstance();        if ($instance->fails()) {            $this->failedValidation($instance);        }    }}

第二步:针对用户Request,我们只需要定义一个UserRequest继承AbstractRequest

<?phpnamespace App\\Http\\Requests;class UserRequest extends AbstractRequest{  public $scenes = [      'nickname' => 'nickname',      'avatar' => 'avatar',      'password' => 'password',      'address' => 'province_id,city_id'  ];  public function rules()  {      return [        //全部的验证规则          'mobile' => [],          'nickname' => [],          'password' => [              'required', 'min:6', 'max:16'          ],          'avatar' => [],          'province_id' => [],          'city_id' => [],          //...      ];  }  public function passwordRules()  {      return [          'password' => [              'required', 'min:6', 'max:16', 'different:$old_password'      //修改新密码不和旧密码相同,此处只是举例子,因为密码需要Hash处理才能判断是否相同          ]      ];  }}

控制器方法 UserController

<?phpnamespace App\\Http\\Controllers;use App\\Http\\Requests\\UserRequest;class UserController{    public function register(UserRequest $request)    {        $request->validate();   //默认不设置场景 全部验证        //...    }    public function updateAddress($id, UserRequest $request)    {        $request->scene('address')->validate();        //...    }    public function updateAvatar($id, UserRequest $request)    {        $request->validate('avatar');        //...    }    public function updatePassword($id, UserRequest $request)    {        //设置password场景,只验证password字段,并且使用新的password规则替换原来的password规则        $request->scene('password')            ->with('password')            ->validate();        //...    }}

该方法没有修改Laravel的核心验证逻辑,只让在FormRequest在注入到Controller的时候不要做自动验证,当然,如果需要自动验证,那么设置$autoValidate = true即可。

以上内容仅供参考。望轻喷。

同时还有我也修改了ORM的场景验证规则,可以在model里设置经常,同时满足多场景创建和更新

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 教你修改Laravel FormRequest验证,实现场景验证 https://www.jike1995.com/37014.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务