侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

lumen中验证类的实现及使用流程步骤

Laravel  /  管理员 发布于 2年前   654

Lumen算是一个精简版的Laravel微型框架,下面是实现验证类的开发步骤:

1.创建验证类trait

  app\Http\Requests\ValidatorTrait.php
<?php
namespace App\Http\Validators;
use Illuminate\Support\Facades\Validator;
trait ValidatorTrait
{
    /**
     * 场景名称
     * @var null
     */
    protected $scene = null;
    /**
     * 只验证的规则
     * @var array
     */
    protected $onlyRule=[];
    protected static $obj=null;
    /**
     * 自定义错误消息
     * @var array
     */
    protected $massage=[
        "required"    => ":attribute 不能为空",
        "required_if"    => ":attribute 不能为空",
        "required_unless"    => ":attribute 不能为空",
        "required_with"    => ":attribute 不能为空",
        "between"     => [
            'string'=>":attribute 长度必须在 :min 和 :max 之间",
            'numeric'=>":attribute 必须在 :min 和 :max 之间",
        ],
        "email"       => ":attribute 格式错误",
        "regex"       => ":attribute 格式错误",
        "mobile"      => ":attribute 格式错误",
        'date_format' => ':attribute 与给定的格式 :format 不符合',
        'unique'      => ':attribute 已存在',
        'min'         => ':attribute 最小长度为 :min 位',
        'max'         => ':attribute 最大长度为 :max 字符',
        'in'          => ':attribute 不在操作范围',
        "numeric"     => ":attribute 不为数字",
        "integer"     => ":attribute 不为整数",
        "string"      => ":attribute 不为字符串",
        "date"      => ":attribute 格式错误",
        "after"      => ":attribute 大于 :date",
        "gt"      => ":attribute 需大于 :value",
        "exists"      => ":attribute 数据有误",
        "point"      => ":attribute 只能保留小数点后 :num 位",
        "digits"      => ":attribute 长度为 :digits 位",
        "digits_between"      => ":attribute 长度为 :min 和 :max 之间",
    ];
    /**
     * @return mixed
     */
    protected function makeValidator()
    {
        $validationData = app('request');
        $validator = Validator::make(
            $validationData->all(),
            $this->getRules(),
            $this->massage,
            method_exists($this,'attributes') ? $this->attributes() : []
        );
        if ($validator->fails()) {
            return $this->failedValidation($validator);
        }else{
            return $validationData;
        }
    }
    /**
     * 返回错误
     * @param $validator
     * @return mixed
     */
    public function failedValidation($validator)
    {
        return $validator->errors()->first();
    }
    /**
     * 验证方法
     * @param mixed $scene  场景名称或验证规则
     */
    public function make($scene='')
    {
        if(!(self::$obj instanceof self)){
            self::$obj = new self();
        }
        if(!empty($scene)){
            if(is_array($scene)){
                self::$obj->onlyRule = $scene;
            }else{
                self::$obj->scene = $scene;
            }
        }
        return self::$obj->makeValidator();
    }
    /**
     * 获取 rules
     * @return array
     */
    protected function getRules(): array
    {
        return $this->handleScene(method_exists($this,'rules') ? $this->rules() : []);
    }
    /**
     * 场景验证
     * @param array $rule
     * @return array
     */
    protected function handleScene(array $rule = []): array
    {
        if($this->onlyRule){
            return $this->handleRule($this->onlyRule,$rule);
        }
        $sceneName = $this->scene;
        if($sceneName && method_exists($this,'scene')){
            $scene = $this->scene();
            if(array_key_exists($sceneName,$scene)) {
                return $this->handleRule($scene[$sceneName],$rule);
            }
        }
        return  $rule;
    }
    /**
     * 处理Rule
     * @param array $sceneRule
     * @param array $rule
     * @return array
     */
    private function handleRule(array $sceneRule,array $rule): array
    {
        $rules = [];
        foreach ($sceneRule as $key => $value) {
            if (is_numeric($key) && array_key_exists($value,$rule)) {
                $rules[$value] = $rule[$value];
            } else {
                $rules[$key] = $value;
            }
        }
        return $rules;
    }
}


2.验证类的使用,例如:下面TestValidator验证类

需要在验证类内里 use ValidatorTrait;

<?php
namespace App\Http\Validators;

class TestValidator
{
    use ValidatorTrait;
    /**
     * 字段注解
     * @return array
     */
    public function attributes():array
    {
        return [
            'name'=>'姓名',
            'email'=>'邮件',
        ];
    }
    /**
     * 验证规则
     * @return array
     */
    public function rules():array
    {
        return [
            'name' => 'required|string|unique:users',
            'email' => 'required|email|unique:users',
        ];
    }
    /**
     * 验证场景
     * @return array
     */
    public function scene():array
    {
        return [
            //add 场景
            'add' => [
                'name' ,       //复用 rules() 下 name 规则
                'email' => 'email|unique:users'  //重置规则
            ],
            //edit场景
            'edit' => ['name'],
        ];
    }
}


3.控制器中验证场景

use App\Http\Validators\TestValidator;

public function add(Request $request){
    //验证所以的
    dd(TestValidator::make());
    //验证 update 场景的字段
    dd(TestValidator::make('add'));
    //验证当前字段或规则
    dd(TestValidator::make(['id'=>['required'],'status']));
}

完,有兴趣的可以自行测试开发该功能。


  • 上一条:
    构建你自己的Laravel扩展包的流程步骤
    下一条:
    windows10中docker desktop安装使用redis服务流程步骤
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • Laravel 11.14版本发布 - 新的字符串助手和ServeCommand改进(0个评论)
    • Laravel 11.12版本发布 - Artisan的`make`命令自动剪切`.php `扩展(0个评论)
    • Laravel的轻量型购物车扩展包:binafy/laravel-cart(0个评论)
    • Laravel 11.11版本发布 - 查看模型中的第三方关系:show(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-01
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客