V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Zhiyicx
V2EX  ›  程序员

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

  •  
  •   Zhiyicx · 2017-07-17 14:53:03 +08:00 · 1806 次点击
    这是一个创建于 2473 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    什么是 ThinkSNS ?

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

    社交系统 ThinkSNS 团队拥有超过九年的移动互联网软件 /网站 /APP 开发经验,涉及行业:粉丝社群、直播互动、移动医疗、电子商务、生活服务、在线教育、旅游出行、移动办公、电子杂志、休闲娱乐、企业信息等。

    需求场景

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

    完成

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

    创建通知场景

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

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

    ThinkSNS+的迁移如下: Alt text

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

    Alt text

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

    加入工厂模式,快捷发送

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

    Alt text

    这样,我们就可以通过 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 中实现的:

    Alt text

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

    完成邮件验证码发送

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

    完成短信验证码发送

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

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

    Alt text

    Alt text

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

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

    Alt text

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

    开发 sms 发送频道

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

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

    Alt text

    这样,基于 easy-sms 的短信通知发送频道就完成了。

    开发场景发送消息

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

    Alt text

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

    Alt text

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

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

    好了我们的开发完成了。

    发送验证码

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

    Alt text

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

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

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

    TS+预售活动了解:http://www.thinksns.com/zx/reader.php?id=94

    TS+安装部署:http://www.thinksns.com/zx/reader.php?id=120

    TS V4 系列开源版源码官方正版获取唯一渠道:关注公众号“ thinksns ”,回复“开源版”即可获得最新源码压缩文件地址。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5139 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 09:34 · PVG 17:34 · LAX 02:34 · JFK 05:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.