首页 后端开发 php教程 Laravel中开发短信验证码发送功能的“规范” (图)

Laravel中开发短信验证码发送功能的“规范” (图)

Oct 27, 2017 am 09:02 AM
laravel 发送 验证

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。接下来通过本文给大家分享在 Laravel 中 “规范” 的开发短信验证码发送功能,需要的朋友参考下吧

Laravel简介

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。

 Laravel 中 “规范” 的开发短信验证码发送功能需求场景

发送「验证码」或者「消息通知」,可发送到手机或邮箱中。

完成

首先,在 Laravel 中的规范就是使用 Laravel 的「消息通知」,这里基于场景为「验证码」。这个需求几乎所有软件系统都有使用到。

创建通知场景

第一步,使用 php artisan make:notification 创建一个通知类,创建成功后默认已经存在了三个方法 via、toMail 和 toArray ,因为是发送验证码,姑将这个控制类命名为 VerificationCode 。

然后创建一个验证码数据模型和数据表迁移,可以使用 php artisan make:model \"VerificationCode\" -m 直接快速创建数据模型和迁移。

ThinkSNS+的迁移如下:

第二步,打开数据模型类,在里面添加 Illuminate\Notifications\Notifiable 性状:

从代码里面,可以看到我们还添加了「软删除」,因为是基于手机号或者邮箱的验证码发送,所以不需要其他的内置花花肠子,也不需要记录到 「消息通知数据表」中,所以 routeNotificationFor 方法我们选择直接返回需要发送的账号(手机号或邮箱)。

加入工厂模式,快捷发送

打开 database/factories/ModelFactory.php 在里面添加一个关于通知数据模型的工厂定义:

这样,我们就可以通过 factory(\Zhiyi\Plus\Models\VerificationCode::class) 工厂函数快捷的创建验证码并发送通知。

为什么在验证码数据模型增加通知性状?

首先 Illuminate\Notifications\Notifiable 这份性状,Laravel 默认添加到 User 模型中的,所以通过 $user->notify() 可以快速的给用户发送一个通知,但是在规范文档中有这么一句话:

Remember, you may use the Illuminate\Notifications\Notifiable trait on any of your models. You are not limited to only including it on your User model.

这是Laravel官方文档原话,意思就是Illuminate\Notifications\Notifiable不仅仅是用在 User 模型上。

所以我们在验证码模型中添加 Illuminate\Notifications\Notifiable 是完全符合Laravel通知的正确使用的。

开发通知类

首先,在数据表迁移中存在一个字段 channel 也就是通知频道标识,我们可根据这个值来决定用什么方式发送验证码,而这个操作在通知类的 via 中实现的:

我们选择方式就是直接返回 channel 值,这个值可以是任何值,只要我们实现了这个通知频道,都可以发送,而Laravel已经内置和一些发送频道 database、mail 和 nexmo

完成邮件验证码发送

其实,这个步骤我们要做的事情已经很少了,生产通知类的时候,已经完成了 toMail 方法,所以,我们直接修改其消息内容即可。

完成短信验证码发送

短信发送我们采用 overtrue/easy-sms 包,这是安正超开发的一个短信发送客户端,已经内置了很多短信平台,实现也很优秀。(吐槽:虽然有些细节有问题,例如不按照契约调用方法传递网关)

首先依赖短信发送客户端包composer require overtrue/easy-sms然后新建配置 /config/sms.php ,内容嘛,就按照 easy-sms 首页的说明增加即可,先贴出我们的配置内容(为了减少文章字数,只保留阿里大于配置):

我门增加了一个 channel 配置,用于不同场景,例如验证码场景 code 以方便消息器读取配置

然后打开 AppServiceProvider.php 在 register 中增加如下:

至此 EasySms 在 Laravel 中的集成已经完成,但是还没有开发实际功能,我们接着往下看。

开发 sms 发送频道

为什么要开发?首先,easy-sms 支持的很多,可以考虑单独为每个发送平台开发一个通知发送频道类,也可以采用只开发一个 sms 发送频道类,我们选择开发一个sms通知发送类,通过 easy-sms 的策略机制去多平台发送验证码。

首先,新建一个 app/Notifications/Channels/SmsChannel.php 文件,因为 Laravel 没有提供生成函数,这个需要自己创建哟,只要实现 send 方法即可。 SmsChannel 内容如下:

这样基于 easy-sms 的 短信通知发送频道已经完成。

开发场景发送消息

这部分完全属于 easy-sms 使用开发,我们新建一个 VerificationCodeMessage.php ,内容如下:

然后我们回到 VerificationCode 验证码通知类中,增加 toSms 方法,我的代码如下:

场景配置,例如验证码不同频道的 template 等,这样消息器就可以根据发送网关来判断使用场景的配置是什么。

再次吐槽,easy-sms 的契约设计也应该是这个思想,但是 getContent/getTemplate/getData 在实际网关调用的时候根本没有传递网关过来。。。

好了我们的开发完成了。

发送验证码

在创建验证码数据模型的时候就已经添加到「工厂」中,所以我们可以直接使用 factory 函数了,发送演示:

大功告成,easy-sms 是一个很不错的包哟。

以上是Laravel中开发短信验证码发送功能的“规范” (图)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Laravel - Artisan 命令 Laravel - Artisan 命令 Aug 27, 2024 am 10:51 AM

Laravel - Artisan 命令 - Laravel 5.7 提供了处理和测试新命令的新方法。它包括测试 artisan 命令的新功能,下面提到了演示?

Laravel - 分页自定义 Laravel - 分页自定义 Aug 27, 2024 am 10:51 AM

Laravel - 分页自定义 - Laravel 包含分页功能,可帮助用户或开发人员包含分页功能。 Laravel 分页器与查询构建器和 Eloquent ORM 集成。自动分页方法

在Laravel中如何获取邮件发送失败时的退信代码? 在Laravel中如何获取邮件发送失败时的退信代码? Apr 01, 2025 pm 02:45 PM

Laravel邮件发送失败时的退信代码获取方法在使用Laravel开发应用时,经常会遇到需要发送验证码的情况。而在实�...

Laravel计划任务不执行:schedule:run命令后任务未运行怎么办? Laravel计划任务不执行:schedule:run命令后任务未运行怎么办? Mar 31, 2025 pm 11:24 PM

Laravel计划任务运行无响应排查在使用Laravel的计划任务调度时,不少开发者会遇到这样的问题:schedule:run...

在 Laravel 中,如何处理邮件发送验证码失败的情况? 在 Laravel 中,如何处理邮件发送验证码失败的情况? Mar 31, 2025 pm 11:48 PM

Laravel邮件发送验证码失败时的处理方法在使用Laravel...

在dcat admin中如何实现点击添加数据的自定义表格功能? 在dcat admin中如何实现点击添加数据的自定义表格功能? Apr 01, 2025 am 07:09 AM

在dcatadmin(laravel-admin)中如何实现自定义点击添加数据的表格功能在使用dcat...

Laravel - 转储服务器 Laravel - 转储服务器 Aug 27, 2024 am 10:51 AM

Laravel - 转储服务器 - Laravel 转储服务器随 Laravel 5.7 版本一起提供。以前的版本不包括任何转储服务器。转储服务器将成为 laravel/laravel Composer 文件中的开发依赖项。

Laravel Redis连接共享:为何select方法会影响其他连接? Laravel Redis连接共享:为何select方法会影响其他连接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis连接的共享与select方法的影响在使用Laravel框架和Redis时,开发者可能会遇到一个问题:通过配置...

See all articles