
后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载Respect Validation 是 PHP 生态中一个以“规则即组件、链式可组合”著称的参数校验库。本文围绕docs/validators/GreaterThanOrEqual.md展开系统讲解v::greaterThanOrEqual()校验器的签名、用法、消息模板与版本演进并深入到 src/Validators/GreaterThanOrEqual.php、src/Validators/Core/Comparison.php 与 src/Helpers/CanCompareValues.php 的实现说明该规则如何完成“大于等于”比较、支持哪些可比类型、又是如何生成错误消息的。读完本文你将能够正确使用该规则校验数值、日期时间、可计数对象等输入并理解其内置消息模板的占位符语义。规则签名与核心语义GreaterThanOrEqual是一个比较类Comparisons校验器其构造签名定义在文档中GreaterThanOrEqual(mixed $compareTo)它用于验证输入值是否大于或等于给定的目标值$compareTo。注意该规则是包含边界的inclusive当输入与目标值相等时校验依然通过。在源码中这一语义落在 src/Validators/GreaterThanOrEqual.php 的核心方法上protected function compare(mixed $left, mixed $right): bool { return $left $right; }类本身继承自Respect\Validation\Validators\Core\Comparison抽象基类只需实现compare()这一个抽象方法即可完成整条规则。同时该规则通过 PHP 原生#[Attribute]与#[Template]声明了元信息#[Composable(with: [Length::class, Max::class, Min::class])] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template( {{subject}} must be greater than or equal to {{compareTo}}, {{subject}} must be less than {{compareTo}}, )] final class GreaterThanOrEqual extends Comparison这里可以读出三个关键实现事实Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE表示该规则可作为 PHP 属性Attribute直接标注在类的属性上且允许重复声明Composable声明了它可以与Length、Max、Min这些校验器组合相关组合入口见下文 Mixin 部分Template的两个模板字符串分别对应默认模式失败消息与反向模式配合v::not()时的失败消息。基本用法示例文档给出了三段可直接运行的示例v::intVal()-greaterThanOrEqual(10)-assert(10); // Validation passes successfully v::intVal()-greaterThanOrEqual(10)-assert(9); // → 9 must be greater than or equal to 10 v::intVal()-greaterThanOrEqual(10)-assert(11); // Validation passes successfully其中v::intVal()先把输入约束为整型再叠加greaterThanOrEqual(10)比较规则assert()失败时会抛出验证异常错误消息为“9 must be greater than or equal to 10”。greaterThanOrEqual这一链式方法由 src/Mixins/Builder.php静态入口v::与 src/Mixins/Chain.php链式实例入口提供签名统一为greaterThanOrEqual(mixed $compareTo): Chain。除基础用法外该规则还衍生出多种上下文组合方法均可在 Mixins 目录中找到对应声明keyGreaterThanOrEqual(int|string $key, mixed $compareTo)校验数组中指定键的值见 src/Mixins/KeyBuilder.phplengthGreaterThanOrEqual(mixed $compareTo)校验长度类输入见 src/Mixins/LengthBuilder.phpmaxGreaterThanOrEqual(mixed $compareTo)在Max语境下取最大值比较见 src/Mixins/MaxBuilder.phpallGreaterThanOrEqual(mixed $compareTo)对集合内每个元素批量应用见 src/Mixins/AllBuilder.php。比较运算的底层原理Comparison 基类GreaterThanOrEqual只负责“怎么比较”而“比较什么、能不能比”由抽象基类 src/Validators/Core/Comparison.php 统一处理。其evaluate()方法完整流程如下public function evaluate(mixed $input): Result { $left $this-toComparable($input); $right $this-toComparable($this-compareTo); $parameters [compareTo $this-compareTo]; if (!$this-isAbleToCompareValues($left, $right)) { return Result::failed($input, $this, $parameters); } return Result::of($this-compare($left, $right), $input, $this, $parameters); }输入值$input与目标值$compareTo都会先经过toComparable()归一化保证两侧处于“可比”的形态结果对象Result统一携带compareTo参数这正是错误消息中{{compareTo}}占位符的数据来源当两侧类型无法比较时isAbleToCompareValues返回 false直接判定失败Result::failed否则把compare()的布尔结果包装进Result::of()由上层决定校验是否通过。归一化toComparable归一化逻辑定义在 src/Helpers/CanCompareValues.php 的CanCompareValuestrait 中private function toComparable(mixed $value): mixed { if ($value instanceof Countable) { return $value-count(); } if ($value instanceof DateTimeInterface || !is_string($value) || is_numeric($value) || empty($value)) { return $value; } if (mb_strlen($value) 1) { return $value; } try { return new DateTimeImmutable($value); } catch (Throwable) { return $value; } }翻译成人话GreaterThanOrEqual支持以下输入形态实现了Countable的对象自动转换为count()返回值于是“一个集合至少有 N 个元素”这类校验可以直接写成v::greaterThanOrEqual(100)-isValid($collection)DateTimeInterface实例原样保留直接按时间对象比较数值型数字或数字字符串原样保留走 PHP 原生数值比较单字符字符串如a保留为字符比较可被 PHP 解析的时间字符串如today、yesterday、13-05-2014 03:16尝试转换为DateTimeImmutable再比较转换失败则退回原字符串。可比性检查isAbleToCompareValuesprivate function isAbleToCompareValues(mixed $left, mixed $right): bool { return is_scalar($left) is_scalar($right); }它要求左右两侧“同为标量或同为非标量”否则认为二者不可比并直接判失败。这意味着把数字与时间字符串混比等场景会被安全拦截而不是抛出 PHP 比较异常。支持的可比数据类型与实用示例文档将GreaterThanOrEqual引导至 docs/comparable-values.md该文档汇总了库内所有比较规则共同支持的数据类型任何实现Countable接口的对象按元素数量比较DateTimeInterface时间对象数值类型整数、浮点单字符字符串按字符序比较常规标量类型交给 PHP 原生比较语义可被 PHP 解析的时间字符串参考 PHP 日期时间格式。结合文档中的示例v::greaterThanOrEqual(100)-isValid($collection); // 元素数 100 时为 true v::dateTime() -between(new DateTime(yesterday), new DateTime(tomorrow)) -isValid(new DateTime(now)); // true v::numericVal()-lessThanOrEqual(10)-isValid(5); // true v::stringVal()-between(a, f)-isValid(d); // true v::dateTime()-between(yesterday, tomorrow)-isValid(now); // true而在 tests/unit/Validators/GreaterThanOrEqualTest.php 中可以通过有效/无效输入矩阵看到更完整的边界行为例如new GreaterThanOrEqual(10)对10、11有效对9无效——边界包含日期字符串2010-01-01与2010-01-01相等时有效new DateTime(yesterday)与new DateTimeImmutable(tomorrow)混合比较有效说明DateTime/DateTimeImmutable可互比相对时间字符串1988-09-09对18 years ago有效new CountableStub(10)对10有效、对0无效——验证 Countable 归一化路径无效用例中还覆盖了new GreaterThanOrEqual(2040)对2018-01-25、new GreaterThanOrEqual(10.5)对2018-01-25这类数字与日期字符串的不可比场景。消息模板与占位符GreaterThanOrEqual的消息模板通过#[Template]属性定义标准模板常量GreaterThanOrEqual::TEMPLATE_STANDARD文档中给出了完整对照表ModeTemplatedefault{{subject}} must be greater than or equal to {{compareTo}}inverted{{subject}} must be less than {{compareTo}}模板占位符如下PlaceholderDescriptioncompareTo与输入进行比较的目标值subject被校验的输入或若指定了自定义校验器名称default模式用于校验失败时inverted模式用于规则被v::not()反向包裹后失败时。这一点可以由 tests/feature/Validators/GreaterThanOrEqualTest.php 中的特性测试直接印证// Scenario #1INF 作为比较目标失败消息中的 compareTo 以反引号包裹 v::greaterThanOrEqual(INF)-assert(10); // → 10 must be greater than or equal to INF // Scenario #2not() 反向包裹命中 inverted 模板 v::not(v::greaterThanOrEqual(5))-assert(INF); // → INF must be less than 5 // Scenario #3时间字符串比较 完整消息含引号 v::greaterThanOrEqual(today)-assert(yesterday); // → - yesterday must be greater than or equal to today // Scenario #4反向模式下的字符比较 v::not(v::greaterThanOrEqual(a))-assert(z); // → - z must be less than a可见消息渲染会依据输入形态INF、字符串、时间字符串自动选择反引号或双引号包裹占位符{{subject}}、{{compareTo}}的语义与文档描述完全一致。subject也支持通过校验器命名如v::greaterThanOrEqual(10)-setName(price)替换为自定义名称使错误信息更贴合业务字段。分类与版本演进分类Comparisons比较类。同一分类下还有GreaterThan、LessThan、LessThanOrEqual、Between、BetweenExclusive等规则它们共享Comparison基类与CanCompareValuestrait因此“可比较类型”的规则对所有比较类校验器通用。Changelog来自文档VersionDescription3.0.0Renamed from Min to GreaterThanOrEqual2.0.0Became always inclusive1.0.0Became inclusive by default0.3.9Created从演进记录可以看出该规则在 0.3.9 创建1.0.0 起默认包含边界2.0.0 起始终包含边界即与严格大于的GreaterThan形成明确分工3.0.0 从旧名Min更名为GreaterThanOrEqual。需要留意的是当前仓库中的 src/Validators/Min.php 已是语义不同的另一条规则——它用于“校验数组最小值是否符合内层校验器”如v::max(v::equals(30))对[10, 20, 30]两者同名不同义迁移时参考 docs/migrating-from-v2-to-v3.md务必区分。相关规则速查该规则与比较类家族关系紧密文档给出了互引清单整理如下均为仓库内文档Between上下界均包含的区间校验可视为“大于等于下界 且 小于等于上界”的组合BetweenExclusive不包含边界的区间校验GreaterThan严格大于不包含边界LessThan严格小于LessThanOrEqual小于等于Max / Min作用于数组聚合值的最大值/最小值校验器Length长度类校验与GreaterThanOrEqual的Composable组合声明相关。小结GreaterThanOrEqual是 Respect Validation 比较类规则中“包含边界”一侧的代表实现外部看它是一个签名GreaterThanOrEqual(mixed $compareTo)、支持链式/属性两种用法的校验器内部看它通过Comparison::evaluate()CanCompareValues完成输入归一化、可比性检查与结果包装最终以$left $right得出结论。无论是校验数值下限、集合元素数量、单字符序还是日期时间的先后关系这套“比较类规则共用同一比较管道”的设计都保证了行为的一致性与可预测性而{{compareTo}}/{{subject}}双占位符模板则让失败消息既标准又可用setName()定制。若需要同时约束上下界直接组合Between即可平滑过渡到区间校验。赞分享后端开发工具【免费下载链接】ValidationThe most awesome validation engine ever created for PHP项目地址https://gitcode.com/gh_mirrors/va/Validation点击查看免费下载相关推荐Respect\Validation 邮箱校验器Email Validator完全指南从基础用法到源码级原理Respect\Validation 邮箱校验器Email Validator完全指南从基础用法到源码级原理 本指南以 Respect\Validatio后端开发工具Respect Validation 的 Base64 校验器用法、判定规则与源码原理Respect Validation 的 Base64 校验器用法、判定规则与源码原理 本篇技术指南以 Respect Validation 开源验证库中的后端开发工具Respect Validation 的 Imei 校验器IMEI 号码校验原理、源码实现与实战用法Respect Validation 的 Imei 校验器IMEI 号码校验原理、源码实现与实战用法 导读 Imei 是 Respect Validation后端开发工具上一篇5个高级应用场景如何用RxPY解决复杂工程挑战下一篇Slim 项目依赖剖析gocolly/colly v2 爬虫框架版本演进与核心 API 实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考