• UID18455
  • 登录2017-11-23
  • 粉丝0
  • 关注0
  • 发帖69
  • 主页
  • 金币379枚
社区居民
原创写手
ThinkSNS 发布于2017-07-17 16:28
0/174

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

楼层直达

顺便发个小通知: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+的迁移如下:

图片:1ThinkSNS研发日记“规范”的开发验证码发送功能程序.png


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

图片:2ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



从代码里面,可以看到我们还添加了「软删除」,因为是基于手机号或者邮箱的验证码发送,所以不需要其他的内置花花肠子,也不需要记录到 「消息通知数据表」中,所以 routeNotificationFor 方法我们选择直接返回需要发送的账号(手机号或邮箱)
加入工厂模式,快捷发送
打开 database/factories/ModelFactory.php 在里面添加一个关于通知数据模型的工厂定义:

图片:3ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



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

图片:4ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



选择方式就是直接返回 channel 值,这个可以是任何值,只要我们实现了这个通知频道,都可以发送,而Laravel已经内置和一些发送频道 databasemailnexmo
完成邮件验证码发送
其实,这个步骤我们要做的事情已经很少了,生产通知类的时候,已经完成了 toMail 方法,所以,我们直接修改其消息内容即可。
完成短信验证码发送
短信发送我们采用 overtrue/easy-sms 包,这是安正超开发的一个短信发送客户端,已经内置了很多短信平台,实现也很优秀。(吐槽:虽然有些细节有问题,例如不按照契约调用方法传递网关)
首先依赖短信发送客户端包composer require overtrue/easy-sms然后新建配置 /config/sms.php ,内容嘛,就按照 easy-sms 首页的说明增加即可,先贴出我们的配置内容(为了减少文章字数,只保留阿里大于配置):

图片:5-1ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



图片:5-2ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



增加了一个 channel 配置,用于不同场景,例如验证码场景 code 以方便消息器读取配置。
然后打开 AppServiceProvider.php 在 register 中增加如下:

图片:6ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



至此 EasySms 在 Laravel 中的集成已经完成,但是还没有开发实际功能,我们接着往下看。
开发 sms 发送频道
为什么要开发?首先,easy-sms 支持的很多,可以考虑单独为每个发送平台开发一个通知发送频道类,也可以采用只开发一个sms 发送频道类,我们选择开发一个sms通知发送类,通过 easy-sms 的策略机制去多平台发送验证码。
首先,新建一个 app/Notifications/Channels/SmsChannel.php 文件,因为 Laravel 没有提供生成函数,这个需要自己创建哟,只要实现 send 方法即可。 SmsChannel 内容如下:

图片:7ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



这样基于 easy-sms 的短信通知发送频道完成
开发场景发送消息
这部分完全属于 easy-sms 使用开发,我们新建一个 VerificationCodeMessage.php 内容如下:

图片:8ThinkSNS研发日记“规范”的开发验证码发送功能程序.png


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

图片:9ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



可以看到,在实例化验证码消息的时候传递了一个 config 进去,什么用呢?其实在前面已经提到了在配置文件中增加长场景配置,例如验证码不同频道的 template 等这样消息器就可以根据发送网关来判断使用场景的配置是什么。
再次吐槽,easy-sms 的契约设计也应该是这个思想,但是 getContent/getTemplate/getData 在实际网关调用的时候根本没有传递网关过来。。。
好了我们开发完成了
发送验证码
在创建验证码数据模型的时候就已经添加到「工厂」中,所以我们可以直接使用 factory 函数了,发送演示:

图片:10ThinkSNS研发日记“规范”的开发验证码发送功能程序.png



大功告成,easy-sms 是一个很不错的包哟。
上面代码都是来自于 ThinkSNS Plus ,看完整的开发代码可以看仓库:
GitHub: https://github.com/slimkit/thinksns-plus(开源不易,求 Star
源码授权购买
现行稳定系统V4系列全端产品(PC/H5/APP),授权源码购买、产品体验,请致电:18108035545开源版源码官方正版获取唯一渠道:关注公众号“thinksns”,回复“开源版”即可获得最新源码压缩文件地址。
TS+预售活动了解http://www.thinksns.com/zx/reader.php?id=94
TS+安装部署:http://www.thinksns.com/zx/reader.php?id=120

0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 79483/378   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 45334/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 45016/0   Python爬虫:常用浏览器的useragent

  • 41525/260   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 38705/145   省时省力的Android组件群来了,非常棒的原型参考

  • 30086/142   2016抢红包软件及源码

  • 29311/2   超全!整理常用的iOS第三方资源

  • 29302/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 24385/160   Android版类似UC浏览器:非常赞,产品级的源码

  • 22882/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22578/25   Android工程师面试题大全

  • 22502/27   2016程序员跳槽全攻略

  • 21959/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20927/20   码魂:程序员的牛B漫画

  • 19088/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 19064/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 19030/10   2016年最全的Android面试考题+答案 精编版

  • 18936/42   一个绚丽的loading动效分析与实现!

  • 18771/3   吐槽那些程序员的搞笑牛逼注释

  • 17658/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 17636/1   iOS 动画总结

  • 17526/82   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 17491/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 17165/23   个人收集的Android 各类功能源代码

  • 16703/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 16627/21   Android福利第三波【Android电子书】

  • 16449/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 16440/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 16411/10   女程序员的梦,众网友的神回复

  • 16387/0   iOS中文版资源库,非常全

  • 16350/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 16097/11   年会上现场review代码是怎么样的体验!

  • 16050/23   珍藏多年的素材,灵感搜寻网站

  • 15540/18   65条最常用正则表达式,你要的都在这里了

  • 14859/15   基于Android支付宝支付设计和开发方案

  • 14271/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 14198/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13988/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13728/0   GitHub iOS 库和框架Top100 

  • 13691/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 13573/7   用程序员的姿势抢过年的火车票

  • 13527/7   一张图搞定iOS学习路线,非常全面

  • 13155/10   成为Java顶尖程序员 ,看这11本书就够了

  • 13115/10   微信支付终于成功了(安卓,iOS),在此分享

  • 13010/18   一张图搞定Android学习路线,非常全面

  • 12828/29   【持续更新中】Android福利贴(一):资料源码

  • 12751/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12503/4   46 个非常有用的 PHP 代码片段

  • 12024/3   即时通信第三方库

  • 11456/8   流媒体视频直播方案

  • 11390/18   八个最优秀的Android Studio插件

  • 11263/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 11048/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 11047/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10958/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 10232/6   开箱即用!Android四款系统架构工具

  • 10023/10   十大技巧快速提升Android应用开发性能

  • 9985/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9931/1   Android性能优化视频,文档以及工具

  • 9842/0   基于node-webkit跨平台应用案例集之(一)

  • 返回顶部