如何在 Laravel 中 “规范” 的开发验证码发送功能【社交系统ThinkSNS研发日记十一】

顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验。php

什么是ThinkSNS ?html

ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+(简称TS+)。git

需求场景github

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

完成app

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

建立通知场景ide

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

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

ThinkSNS+的迁移以下:

图片描述

第二步,打开数据模型类,在里面添加 IlluminateNotificationsNotifiable 性状:

图片描述

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

加入工厂模式,快捷发送

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

图片描述

这样,咱们就能够经过 factory(ZhiyiPlusModelsVerificationCode::class) 工厂函数快捷的建立验证码并发送通知。

为何在验证码数据模型增长通知性状?

首先 IlluminateNotificationsNotifiable 这份性状,Laravel 默认添加到 User 模型中的,因此经过 $user->notify() 能够快速的给用户发送一个通知,可是在规范文档中有这么一句话:

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

这是Laravel官方文档原话,意思就是IlluminateNotificationsNotifiable不单单是用在 User 模型上。

因此咱们在验证码模型中添加 IlluminateNotificationsNotifiable 是彻底符合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 方法,代码以下:

图片描述

能够看到,在实例化验证码消息的时候传递了一个 config 进去,有什么用呢?其实在前面已经提到了:在配置文件中增长长场景配置,例如验证码不一样频道的 template 等,这样消息器就能够根据发送网关来判断使用场景的配置是什么。

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

好了咱们的开发完成了。

发送验证码

在建立验证码数据模型的时候就已经添加到「工厂」中,因此咱们能够直接使用 factory 函数了,发送演示:

图片描述

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

上面代码都是来自于 ThinkSNS Plus ,看完整的开发代码能够看仓库:

GitHub: https://github.com/slimkit/th...(开源不易,求 Star )

源码受权购买

现行稳定系统V4系列全端产品(PC/H5/APP),受权源码购买、产品体验,请致电:18108035545开源版源码官方正版获取惟一渠道:关注公众号“thinksns”,回复“开源版”便可得到最新源码压缩文件地址。

TS+安装部署:http://www.thinksns.com/reade...

相关文章
相关标签/搜索