缓存验证规则数组、语言包消息和条件判断结果可显著提升高频表单验证性能;需按租户/用户角色区分缓存键,避免闭包规则,且规则变更时必须主动失效对应缓存。

缓存验证规则数组能直接减少每次请求时的规则构建开销,对高频表单(如登录、注册、后台提交)效果最明显;但规则动态变化时必须主动失效缓存,否则会跳过新约束。
缓存 Validator::make() 的规则参数数组
验证规则本身常从数据库或配置文件读取(比如字段长度限制、正则白名单),这些操作在每次请求中重复执行是低效的。把整个规则数组序列化后存进缓存,可跳过重建过程。
-
cache()->get('validation_rules.user_register')优先读取,命中即用 - 未命中时构建规则(例如查
field_configs表),再调用cache()->put('validation_rules.user_register', $rules, 3600)写入,有效期建议设为 1 小时 - 注意:若规则依赖用户角色或租户 ID,缓存键需包含该变量,如
'validation_rules.user_register.tenant_'.$tenantId - 不要缓存含闭包的规则(如
'email' => ['required', function ($attribute, $value, $fail) { ... }]),PHP 无法序列化闭包,会报Serialization of 'Closure' is not allowed
复用 lang/zh/validation.php 消息数组避免重复加载
语言包文件每次 require 都要解析 PHP 数组,尤其在多语言切换或大量字段验证时,开销不可忽视。缓存整个消息数组比单条消息更省事。
- 用
cache()->remember('validation_messages.zh', 7200, function () { return require base_path('lang/zh/validation.php'); })加载并缓存 - 创建验证器时传入:
Validator::make($data, $rules)->messages($cachedMessages) - 确保缓存键带语言标识,否则中英文消息混用会导致
trans('validation.required')返回空字符串 - 修改语言包后需手动清除缓存:
php artisan cache:forget validation_messages.zh
跳过重复的条件判断逻辑,比如“仅 premium 用户校验邀请码”
这类验证常写成 'invite_code' => 'required_if:user_type,premium',但 required_if 底层仍要查用户类型。若用户类型稳定,可提前算好是否启用该字段验证。
- 构造唯一键:
'validation_condition.user_'.$userId.'.invite_code_required' - 用
cache()->get($key, false)获取布尔值,true则加入规则,false则跳过 - 用户升级为 premium 后,必须调用
cache()->forget($key),否则下次请求仍按旧结果执行 - 别用
cache()->has($key)判断,因为缓存值可能是false,has()会返回false导致误判
验证提速的关键不在“加功能”,而在识别哪些计算是冗余的——规则数组构建、语言包加载、条件开关判定,这三类操作一旦固化,就值得缓存。但所有缓存都绕不开一个事实:你得清楚什么时候该 forget(),否则验证逻辑就悄悄失效了。











