【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能 !
来源:互联网 发布:搜客软件 编辑:程序博客网 时间:2024/06/05 23:39
顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验。
需求场景
发送「验证码」或者「消息通知」,可发送到手机或邮箱中。
完成
首先,在 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 方法,代码如下:
可以看到,在实例化验证码消息的时候传递了一个 config 进去,有什么用呢?其实在前面已经提到了:在配置文件中增加长场景配置,例如验证码不同频道的 template 等,这样消息器就可以根据发送网关来判断使用场景的配置是什么。
再次吐槽,easy-sms 的契约设计也应该是这个思想,但是 getContent/getTemplate/getData 在实际网关调用的时候根本没有传递网关过来。。。
好了我们的开发完成了。
发送验证码
在创建验证码数据模型的时候就已经添加到「工厂」中,所以我们可以直接使用 factory 函数了,发送演示:
大功告成,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
源码授权咨询:
现行稳定系统V4系列全端产品(PC/H5/APP),授权源码购买、产品体验,请致电:18108035545
开源版源码官方正版获取唯一渠道:关注公众号“thinksns”,回复“开源版”即可获得最新源码压缩文件地址。
- 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能 !
- 如何在 Laravel 中 “规范” 的开发验证码发送功能
- 不使用三方包时,如何在社交系统ThinkSNS中建立优雅的用户权限管理【研发日记13】
- 社交系统ThinkSNS+研发日记四:如何做到 Laravel 配置可以网站后台配置
- 基于 Laravel Route 的 社交系统ThinkSNS+ Component【研发日记三】
- 【社交系统ThinkSNS研发日记十二】Laravel Model 利用 Macroable 为数据模型添加宏能力
- ThinkSNS+如何计算字符显示长度?【社交系统研发日记五】
- laravel中实现短信发送验证码
- 基于 Laravel、Vue.js开发的全新社交系统----ThinkSNS+
- 关于 Overtrue 的拼音库 overtrue/pinyin 为何 travis 为 error【社交系统研发日记十】
- 如何在struts2中实现登陆的验证码功能
- 如何在struts2中实现登陆的验证码功能
- 基于 Laravel 开发 社群系统ThinkSNS+ 中前端的抉择(webpack/Vue)踩坑日记
- [研发管理]如何做好小团队的开发规范?
- 如何在研发项目中提高RDC的研发能力
- Laravel框架中验证码的使用
- 社交系统ThinkSNS+ alpha.2 版本发布,快来看看都有些什么【研发日记六】
- laravel框架手机发送验证码
- 为什么心跳包(HeartBeat)是必须的?
- AndroidStudio打包apk,安装失败,提示应用未安装解决
- 单例模式最优方案
- Kotlin 语法的简单介绍
- scala 传名调用call-by-name
- 【社交系统研发日记】如何在 Laravel 中 “规范” 的开发验证码发送功能 !
- CentOS 7 关闭图形界面
- Laravel基础-Illuminate所在位置
- Spring家族学习
- 最少钱币数梦幻王国
- java中会存在内存泄漏吗
- elasticsearch之Document APIs【Index API】
- POJ 3280 Cheapest Palindrome(回文,区间DP)
- DCGAN例子学习-MNIST 手写体数字生成