Laravel自定义验证规则?验证规则怎样创建?

Laravel中创建自定义验证规则有两种方式:闭包扩展和独立规则类。闭包方式通过Validator::extend在AppServiceProvider中定义,适用于简单、一次性验证逻辑,如身份证格式校验;而更推荐的做法是使用php artisan make:rule生成规则类,将验证逻辑封装在validate方法中,实现ValidationRule接口,并可通过实现DataAwareRule访问全部请求数据,便于跨字段验证。该方式结构清晰、易于测试,适合复杂业务场景,如验证订单日期逻辑、库存数量等。最佳实践包括遵循单一职责原则、提供友好错误消息、编写单元测试,并避免过度使用自定义规则。对于数据库查询类规则,应注意性能优化,如缓存或预加载数据,以提升效率。

laravel自定义验证规则?验证规则怎样创建?

Laravel中创建自定义验证规则,主要有两种方式:一种是快速便捷的闭包(Closure)扩展,另一种是更结构化、可复用的独立规则类。当你需要处理一些内置规则无法覆盖的复杂业务逻辑时,自定义规则就显得尤为重要,它能让你的验证逻辑清晰地与控制器或模型分离。

说实话,每次遇到复杂的表单验证,内置规则总感觉差那么一点意思。比如要验证一个字符串必须是特定格式的身份证号,或者某个字段的值必须在另一个表的某个特定范围内,这时候自定义规则就是我的救星。

最直接的方法,也是我个人在小型项目或快速迭代时常用的,就是利用

Rule::extend

方法。你可以在

AppServiceProvider

boot

方法里定义它,或者任何你觉得合适的服务提供者。

// AppServiceProvider.phpuse Illuminate\Support\Facades\Validator;public function boot(){    Validator::extend('id_card', function ($attribute, $value, $parameters, $validator) {        // 这里写你的验证逻辑        // 假设一个非常简化的身份证验证,实际应用会更复杂        // 生产环境请使用更严谨的身份证校验算法        return preg_match('/^\d{17}(\d|X)$/i', $value);    });    // 你也可以定义一个错误消息    Validator::replacer('id_card', function ($message, $attribute, $rule, $parameters) {        return 'The ' . $attribute . ' must be a valid ID card number.';    });}

这样定义之后,你就可以在验证规则数组里直接用

id_card

了,就像用

required

email

一样。这种方式的好处是快,坏处是如果规则逻辑复杂或者需要在多个地方复用,代码可能会显得有点分散,不够优雅。

更推荐、也更符合Laravel哲学的方式,是创建一个独立的规则类。这其实是把验证逻辑封装起来,让它更易于管理和测试。你可以通过 Artisan 命令来生成:

php artisan make:rule ValidIdCard

这会生成一个

app/Rules/ValidIdCard.php

文件。里面有两个核心方法:

passes

message

// app/Rules/ValidIdCard.phpnamespace App\Rules;use Closure;use Illuminate\Contracts\Validation\Rule; // Laravel 8 及以下use Illuminate\Contracts\Validation\ValidationRule; // Laravel 9+ 推荐use Illuminate\Contracts\Validation\DataAwareRule; // 如果需要访问所有验证数据// 根据你的Laravel版本选择实现 Rule 或 ValidationRuleclass ValidIdCard implements ValidationRule, DataAwareRule{    protected $allData;    /**     * Set the data under validation.     *     * @param  array  $data     */    public function setData(array $data): static    {        $this->allData = $data;        return $this;    }    /**     * Determine if the validation rule passes.     *     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail     */    public function validate(string $attribute, mixed $value, Closure $fail): void    {        // 同样,一个简化的身份证验证        // 实际应用中需要更严谨的校验,例如根据出生日期、校验位等        if (!preg_match('/^\d{17}(\d|X)$/i', (string) $value)) {            $fail('The :attribute must be a valid ID card number.');        }        // 如果需要访问其他字段,比如验证生日是否与身份证号匹配        // if (isset($this->allData['birthday']) && $this->allData['birthday'] !== substr($value, 6, 8)) {        //     $fail('The :attribute does not match the provided birthday.');        // }    }    // 对于 Laravel 8 及以下版本,需要实现 passes 和 message 方法    // public function passes($attribute, $value)    // {    //     return preg_match('/^\d{17}(\d|X)$/i', (string) $value);    // }    // public function message()    // {    //     return 'The :attribute must be a valid ID card number.';    // }}

然后在你的验证器里,像这样使用:

use App\Rules\ValidIdCard;$request->validate([    'id_number' => ['required', new ValidIdCard()],    // 如果规则需要构造函数参数    // 'id_number' => ['required', new ValidIdCard($someParam)],]);

这种方式,在我看来,是处理复杂验证逻辑的最佳实践。它让你的规则代码更集中、更清晰,也更容易进行单元测试。当你的项目规模变大,或者团队协作时,这种结构化的方式会大大提升可维护性。

Laravel自定义验证规则的常见应用场景与最佳实践

自定义验证规则,远不止是填补内置规则的空白那么简单。它更像是一个工具箱,让你能灵活应对各种业务场景。我个人觉得,它最亮眼的地方,就是处理那些“非标准”的验证需求。

PatentPal专利申请写作 PatentPal专利申请写作

AI软件来为专利申请自动生成内容

PatentPal专利申请写作 266 查看详情 PatentPal专利申请写作

比如,你可能需要验证一个用户名在数据库中是否已存在,但又不想每次都写

unique:users,username

这种,因为可能还有一些额外的逻辑,比如忽略软删除的用户,或者在更新时排除当前用户。这时候,一个

UniqueUsername

规则类就能把这些逻辑封装起来,让控制器代码保持简洁。

另一个常见场景是数据一致性验证。例如,一个订单的开始日期不能晚于结束日期;或者一个商品的库存数量不能低于已售数量。这些都需要根据其他字段的值来判断当前字段的有效性,而内置规则通常只能针对单个字段进行独立判断。这时,实现

DataAwareRule

接口就显得尤为重要,它允许你在规则类中访问所有请求数据,从而进行跨字段的复杂验证。

再比如,我们经常会遇到一些特定的业务规则,比如某个优惠码必须在有效期内且未使用过,或者一个用户组只能访问某些特定的资源。这些都属于业务逻辑范畴,如果直接写在控制器里,控制器会变得非常臃肿且难以阅读。将它们抽象成自定义规则,能让你的控制器保持轻量级,专注于请求处理和响应。

至于最佳实践,我通常会遵循几个原则:

单一职责原则: 一个自定义规则只负责一件事。如果一个规则变得过于复杂,考虑拆分成多个规则。可读性:

validate

方法(或

passes

方法)的逻辑应该清晰易懂。如果逻辑复杂,可以抽取私有方法来提高可读性。错误消息: 务必提供清晰、用户友好的错误消息。最好是利用语言文件,方便国际化。单元测试: 为你的自定义规则编写单元测试,确保它们在各种情况下都能正确工作。这是保证代码质量的关键一环。避免过度使用: 并非所有验证都需要自定义规则。对于简单的

required

email

等,直接使用内置规则即可。只有当内置规则无法满足需求时,才考虑自定义。

如何编写高效且可维护的自定义验证规则?

编写高效且可维护的自定义验证规则,这其实是个工程问题,不仅仅是代码写出来能跑就行。我发现很多时候,大家写自定义规则,只关注了“能用”,但忽略了“好用”和“易维护”。

首先,性能考虑。如果你的验证规则需要查询数据库,比如验证某个 ID 是否存在,或者用户名是否唯一,那么你需要考虑查询的效率。避免在

validate

方法中执行不必要的、重复的数据库查询。如果规则被多次调用,或者在一个循环中,这可能会成为性能瓶颈。有时候,可以在规则的构造函数中预先加载一些数据,或者利用缓存来优化。

其次,可读性和可测试性。这是我个人最看重的。一个好的规则类,它的

validate

方法应该像一个故事一样,清晰地讲述验证逻辑。如果逻辑比较复杂,我会倾向于

以上就是Laravel自定义验证规则?验证规则怎样创建?的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/836110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
他让盆栽控制大砍刀、驾驶无人机,还让苍蝇敲键盘发帖,网友:好怪,再看一眼
上一篇 2025年11月27日 10:29:39
PHP微框架:Slim 和 Phalcon 的文档和资源对比
下一篇 2025年11月27日 10:29:42

相关推荐

  • 新华网财经观察丨当家电拥抱大模型

    新华网财经观察丨当家电拥抱大模型新华网财经观察丨当家电拥抱大模型新华网财经观察丨当家电拥抱大模型新华网财经观察丨当家电拥抱大模型

    ai赋能家电:智能家居新时代来临 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在人工智能浪潮席卷全球的当下,国内头部家电品牌正积极拥抱“AI+家电”模式,纷纷加大自主研发投入,布局AI大模型技术,同时积极引入DeepSeek等开源大模型,…

    2026年8月29日 用户投稿
    000
  • workerman是怎么区分用户的

    WorkerMan区分用户的方式取决于连接ID,将连接ID与用户数据关联。具体方法包括:字典映射(低并发场景)、Redis哈希结构(高并发场景)、数据库(复杂数据管理)。优化要点:选择合适的数据存储、使用连接池、采用异步操作、处理错误、保证代码可读。 WorkerMan用户区分:深度剖析与最佳实践 …

    2026年8月29日
    000
  • 《优米雅的炼金工房》联动DLC上线 全新预告片与抽奖活动!

    《优米雅的炼金工房》联动DLC上线 全新预告片与抽奖活动!《优米雅的炼金工房》联动DLC上线 全新预告片与抽奖活动!《优米雅的炼金工房》联动DLC上线 全新预告片与抽奖活动!《优米雅的炼金工房》联动DLC上线 全新预告片与抽奖活动!

    近日,游戏开发商光荣特库摩正式宣布,《优米雅的炼金工房》将与《美德传奇f高清复刻版》展开联动合作,本次联动活动已正式上线。联动期间将推出免费的服装dlc内容,并同步开启抽奖活动,截止时间为2025年7月6日(星期日)。与此同时,全新的宣传视频也已发布,一起来了解一下详情吧! 宣传视频: 《优米雅的炼…

    2026年8月29日 用户投稿
    000
  • 贝壳找房怎么收藏喜欢的房源_贝壳找房App收藏房源操作指南

    在贝壳找房App中,进入房源详情页点击右上角爱心图标即可收藏;2. 收藏后可在“我的”-“我的收藏”中查看和管理;3. 点击已收藏的红色爱心可取消;4. 建议收藏时添加“近地铁”“学区房”等备注便于后续筛选。 在贝壳找房App上收藏喜欢的房源很简单,方便你随时查看和对比。 如何收藏房源 打开贝壳找房…

    2026年8月29日
    000
  • 灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验

    灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验灵活多变创意十足 三星GalaxyZ Flip7解锁自拍新体验

    在这个视觉内容主导的时代,无论是朋友圈还是各类社交平台,自拍已成为极具吸引力的内容形式之一。人们通过发布状态满分的自拍作品展示个性风格、记录生活点滴,并从中获得更多的认同与互动。正因如此,在不断记录自我的过程中,用户对手机拍摄性能的要求也日益提升。三星galaxyz flip7凭借“立式自由拍摄系统…

    2026年8月29日 用户投稿
    000
  • thinkphp怎么实现分页教程

    ThinkPHP分页的核心在于SQL LIMIT子句,paginate()方法封装了底层数据库查询和数据处理。它允许自定义分页样式和参数,并提供性能优化技巧,如使用缓存、数据库优化和避免N+1问题,以应对复杂的分页场景。 ThinkPHP分页:不止是paginate()那么简单 很多朋友觉得Thin…

    2026年8月29日
    200
  • 关于Windows 10系统重置了但以前的office找不到了问题的解决方法

    关于Windows 10系统重置了但以前的office找不到了问题的解决方法关于Windows 10系统重置了但以前的office找不到了问题的解决方法关于Windows 10系统重置了但以前的office找不到了问题的解决方法关于Windows 10系统重置了但以前的office找不到了问题的解决方法

    关于windows 10系统重置后无法找到之前的office软件的解决方案,首先需要在微软官网登录自己的windows账户,确认账户中是否有记录的设备信息。如果没有,请使用微软账号登录windows系统。接着,访问office官网,检查账户下是否有office设备记录。如果没有找到,请在电脑上搜索w…

    2026年8月29日 用户投稿
    300
  • Win7系统摄像头打不开是怎么回事?Win7系统摄像头打不开解决办法

    在日常使用电脑的过程中,摄像头是一个非常实用的工具。然而,有时我们可能会遇到摄像头无法正常开启的情况。那么,为什么会发生这样的问题呢?下面我们一起来分析一下可能的原因。 首先,最常见的一个原因是驱动程序相关的问题。如果摄像头的驱动没有正确安装或者已经过时,就可能导致设备无法正常运行。其次,某些正在运…

    2026年8月29日
    100
  • Android WebView无法加载alipays://协议链接怎么办?

    Android WebView加载alipays://协议链接失败的解决方案 在Android开发中,WebView有时无法加载自定义URL scheme,例如alipays://,导致出现net::err_unknown_url_scheme错误,即使重写了shouldOverrideUrlLoa…

    2026年8月29日
    100
  • 曝苹果iPhone 17 Air将主打蓝色 秋季发布 颜值稳了?

    据海外媒体报道,苹果即将推出的iphone 17 air在配色方面或将带来全新选择。这款机型或将主打一种前所未有的浅蓝色,成为苹果历史上最具辨识度的蓝色版本。 根据爆料信息,这种蓝色调非常淡雅,呈现出接近白灰色的视觉效果,在较暗环境下甚至可能被误认为是白色。如果消息属实,这将是继iPhone 13 …

    2026年8月29日
    100
  • 如何解决异步消息处理中的复杂性?使用Composer安装enqueue/amqp-lib可以!

    在开发一个需要处理大量异步消息的项目时,我遇到了一个复杂的问题:如何高效地管理和传输这些消息?尝试了多种方法后,我发现使用 enqueue/amqp-lib 库能够显著简化这一过程。 可以通过以下地址学习 composer:学习地址 enqueue/amqp-lib 是一个基于 AMQP 协议的消息…

    用户投稿 2026年8月29日
    000
  • Win10系统出现ntkrnlmp.exe蓝屏如何解决?

    Win10系统出现ntkrnlmp.exe蓝屏如何解决?Win10系统出现ntkrnlmp.exe蓝屏如何解决?Win10系统出现ntkrnlmp.exe蓝屏如何解决?Win10系统出现ntkrnlmp.exe蓝屏如何解决?

    ntldr.exe是什么?win10系统出现ntldr.exe蓝屏又是怎么回事?有用户反馈自己的电脑出现ntldr.exe蓝屏,即使重装系统也未能解决问题,这该如何处理呢?接下来我们就一起看看问题的分析与解决办法吧。 什么是NTLDR.exe? Ntlr代表NT装载程序,它是Windows系统中合法…

    2026年8月29日 用户投稿
    000
  • win11怎么开启卓越性能模式_win11开启卓越性能模式操作教程

    通过管理员终端执行powercfg命令可启用隐藏的“卓越性能”模式;2. 若未显示,可通过设置应用刷新电源选项列表;3. 使用搜索功能可快速以管理员身份运行终端完成操作。 如果您发现Windows 11的电源选项中缺少“卓越性能”模式,导致无法最大化发挥硬件性能,可以通过系统内置命令手动启用该隐藏的…

    2026年8月29日
    600
  • 如何解决图片和视频的复杂变换问题?使用CloudinaryTransformationBuilderSDK可以!

    可以通过一下地址学习composer:学习地址 在开发网站和移动应用时,处理图片和视频的变换和优化是常见但又复杂的任务。我最近在项目中遇到的问题是需要对大量图片进行尺寸调整、格式转换和优化处理。这不仅需要大量的时间和精力,而且容易出错。经过一番探索,我发现了 cloudinary transform…

    用户投稿 2026年8月29日
    100
  • 高德导航如何查看街景地图_高德导航街景地图的使用指南

    高德导航提供街景地图功能,可通过图层、长按地图、详情页或下载离线数据四种方式查看目的地实景。 如果您想提前了解目的地的真实环境,避免因信息不全而走错路或选错地点,高德导航提供了街景地图功能,可以直观查看道路、建筑及周边设施的实景画面。以下是具体操作方法。 本文运行环境:华为Mate 60 Pro,H…

    2026年8月29日
    000
  • 联想主机系统蓝屏代码0x0000001A的排查与解决方案详解

    联想主机系统蓝屏代码0x0000001A的排查与解决方案详解联想主机系统蓝屏代码0x0000001A的排查与解决方案详解联想主机系统蓝屏代码0x0000001A的排查与解决方案详解联想主机系统蓝屏代码0x0000001A的排查与解决方案详解

    蓝屏代码0x0000001a表示“memory_management”异常,通常由内存管理错误引发。常见原因包括内存条故障、驱动冲突、系统文件损坏或第三方软件冲突。排查方法如下:1. 检查内存条插拔状态并使用windows内存诊断工具检测;2. 更新或回滚不兼容的驱动程序,尤其是显卡和主板驱动;3.…

    2026年8月29日 用户投稿
    400
  • 魔兽世界污染者战袍零门槛获取指南!阿拉希盆地速刷秘籍

    幻化党狂喜!污染者战袍作为《魔兽世界》经典绝版外观,暗绿纹路与金属肩甲堪称部落荣耀象征。无需声望苦熬,不用看脸掉落,这份保姆级攻略带你轻松入手战场传奇战袍,新手也能一小时拿下! 第一步:高地集结!寻找任务使者传送坐标:直飞阿拉希高地! 关键NPC:抵达中部避难谷地(联盟)/ 落锤镇(部落),定位奥斯…

    2026年8月29日
    100
  • 在悟空浏览器上怎么免费看电视剧 免会员看剧资源获取方法

    免费看电视剧的关键在于选择合适的资源渠道而非依赖悟空浏览器本身,可通过正版平台免费专区、聚合类影视app、第三方网站、bt下载或短视频平台获取资源,但需注意版权、安全、广告和画质等风险,为安全追剧应优先选择正规渠道、安装杀毒软件、谨慎点击链接、保护个人信息并使用广告拦截插件,同时解决卡顿问题可检查网…

    2026年8月29日
    100
  • MySQL日志审计如何实现_满足合规需求的方法?

    MySQL日志审计如何实现_满足合规需求的方法?MySQL日志审计如何实现_满足合规需求的方法?MySQL日志审计如何实现_满足合规需求的方法?MySQL日志审计如何实现_满足合规需求的方法?

    mysql日志审计可通过多种方式组合实现,以满足不同场景的合规需求。1. 开启通用查询日志可记录所有sql操作,适合低并发系统,但无法区分用户身份;2. 慢查询日志结合过滤机制可用于监控耗时操作,但仅作为补充手段;3. 启用二进制日志(row格式)可实现数据变更的细粒度审计,并通过工具解析具体操作;…

    2026年8月29日 用户投稿
    200
  • ThinkPHP 队列(Queue)与异步任务处理

    在thinkphp中,可以使用队列来处理异步任务。具体方法包括:1.定义任务类并实现fire方法;2.使用queue::push方法将任务推送到队列中;3.通过配置驱动(如redis或数据库)来管理和执行任务。这种方式可以有效提升应用性能和用户体验。 引言 在现代Web开发中,异步任务处理和队列管理…

    2026年8月29日
    100

发表回复

登录后才能评论
关注微信