什么是ThinkSNS ?php
ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+(简称TS+)、ThinkSNS V四、ThinkSNS【简】。git
需求场景github
发送「验证码」或者「消息通知」,可发送到手机或邮箱中。并发
完成app
首先,在Laravel中的规范就是使用Laravel的「消息通知」,这里基于场景为「验证码」。这个需求几乎全部软件系统都有使用到。composer
建立通知场景ide
第一步,使用php artisan make:notification建立一个通知类,建立成功后默认已经存在了三个方法via、toMail和toArray,由于是发送验证码,姑将这个控制类命名为VerificationCode。函数
而后建立一个验证码数据模型和数据表迁移,可使用php artisan make:model "VerificationCode" -m直接快速建立数据模型和迁移。ui
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 theIlluminate\Notifications\Notifiabletrait on any of your models. You are not limited to only including it on yourUsermodel.
这是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)