You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9自定义Rule迁移至Laravel 10的适配方案咨询

Laravel 9 自定义规则在 Laravel 10 中的兼容与改造方案

能否直接沿用旧规则?

可以直接沿用。Laravel 10 依旧保留了对 Illuminate\Contracts\Validation\Rule 接口的兼容,你在 Laravel 9 里写的这套自定义规则,不用改就能在 Laravel 10 项目里正常运行。

若要适配 Laravel 10 新写法的修改步骤

如果想切换到 Laravel 10 推荐的新规则写法,可按以下步骤调整:

  1. 替换接口依赖
    新规则不再需要实现 Illuminate\Contracts\Validation\Rule,改用 Illuminate\Contracts\Validation\ValidationRule 接口,或者直接继承 Illuminate\Validation\Rule 抽象类(更省事)。

  2. 合并方法逻辑
    把原来的 passes 和 message 方法替换成 validate 方法——新方法不需要返回布尔值,而是通过传入的 Closure $fail 回调触发验证失败信息,错误提示直接写在回调里。

调整后的代码示例:

<?php

namespace Auth\Http\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class CustomRule implements ValidationRule
{
    public function __construct()
    {
        // 原构造逻辑保持不变
    }

    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (strlen($value) !== 15) {
            $fail('value is invalid');
        }
    }
}

也可以用继承抽象类的方式(不用手动引入接口):

<?php

namespace Auth\Http\Rules;

use Closure;
use Illuminate\Validation\Rule;

class CustomRule extends Rule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (strlen($value) !== 15) {
            $fail('value is invalid');
        }
    }
}

两种写法的差异

  • 旧写法:靠passes返回布尔值判断验证结果,message单独定义错误信息,适合简单场景。
  • 新写法:通过fail回调触发错误,能根据不同场景动态生成提示,逻辑更灵活。

内容的提问来源于stack exchange,提问作者hossein ir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:22:17