当前位置: 首页 > Linux

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

时间:2023-04-06 19:43:48 Linux

顺便发个小通知:7月15日,ThinkSNS+开源版发布,并且非开源APP也走出内测阶段,体验二维码,全面释放体验。ThinkSNS是什么?ThinkSNS(简称TS),一个全平台综合社交系统,为国内外中小企业和创业者提供社交软件开发和技术解决方案。最新版本为ThinkSNS+(简称TS+)。需求场景下发送“验证码”或“消息通知”,可发送至手机或邮箱。补全首先,Laravel中的规范是使用Laravel的“消息通知”,它是基于场景的“验证码”。几乎所有的软件系统都会用到这个需求。创建一个通知场景第一步是使用phpartisanmake:notification创建一个通知类。创建成功后默认有toMail和toArray三个方法via。因为是发送验证码,所以我将这个控件类命名为VerificationCode。然后创建验证码数据模型和数据表迁移,可以使用phpartisanmake:model"VerificationCode"-m直接快速创建数据模型和迁移。ThinkSNS+的迁移如下:第二步,打开数据模型类,在里面添加IlluminateNotificationsNotifiabletrait:从代码中可以看出我们也添加了“软删除”,因为它是基于手机号或邮箱的验证码,所以不需要其他内置的花式肠子,也不需要记录在“消息通知数据表”中,所以我们选择直接返回账号(routeNotificationFor方法中需要发送的手机号或邮箱)。加入工厂模式并快速发送打开database/factories/ModelFactory.php,添加一个关于通知数据模型的工厂定义:这样我们就可以通过工厂(ZhiyiPlusModelsVerificationCode::class)工厂快速创建验证码和发送通知功能。为什么要在验证码数据模型中添加通知特征?首先,Laravel默认在User模型中添加了IlluminateNotificationsNotifiable这个trait,这样就可以通过$user->notify()快速的向用户发送通知,但是在规范文档中有这么一句话:记住,你可以在你的任何模型上使用IlluminateNotificationsNotifiable特性。您不仅限于将它包含在您的用户模型中。这是Laravel官方文档的原版,也就是说IlluminateNotificationsNotifiable不仅仅用在User模型上。所以我们在验证码模型中添加IlluminateNotificationsNotifiable与正确使用Laravel通知是完全一致的。开发通知类首先,数据表迁移中有一个字段channel,就是通知通道标识。我们可以根据这个值来决定如何发送验证码,这个操作是在通知类的via中实现的:我们选择的方式是直接返回通道值,这个值可以是任意值,只要我们实现这个通知通道,是可以发送的,Laravel内置了一些发送通道database,mail和nexmo来完成邮件验证码的发送,其实这一步我们需要做的事情很少。当通知类产生时,toMail方法已经完成,我们可以直接修改它的消息内容。完成短信验证码并发送短信。我们使用overtrue/easy-sms包,这是安正超开发的短信发送客户端。内置了很多短信平台,实现也很不错。(吐槽:虽然有些细节有问题,比如没有按照合约调用方法通过网关)先依赖短信发送客户端包composerrequireovertrue/easy-sms然后新建配置/config/sms.php,内容,只要按照easy-sms主页上的描述添加即可,先贴出我们的配置内容(为了减少文章字数,只保留阿里>配置):我们针对不同的场景添加了通道配置,比如验证码场景码,方便消息者读取获取配置。然后打开AppServiceProvider.php,在register中添加如下内容:至此EasySms在Laravel中的集成已经完成,但是实际的功能还没有开发出来,我们往下看。为什么要开发短信发送通道?首先,easy-sms支持很多。可以考虑为每个发送平台单独开发一个通知发送通道类,也可以只开发一个短信发送通道类。我们选择通过easy-sms策略机制开发一个短信通知发送类,用于向多个平台发送验证码。首先新建一个app/Notifications/Channels/SmsChannel.php文件,因为Laravel没有提供generator函数,这个需要自己新建,只要实现send方法即可。SmsChannel的内容如下:至此,基于easy-sms的发送短信通知的通道就完成了。开发场景中发送消息的部分属于easy-sms的使用和开发。我们新建一个VerificationCodeMessage.php,内容如下:然后返回VerificationCode验证码通知类,添加toSms方法。代码如下:可以看到,实例化了验证码,发送消息的时候,传入一个config,有什么用呢?其实上面已经提到了:在配置文件中添加长场景配置,比如不同渠道验证码的模板等,让信使根据发送网关确定使用场景的配置。再次吐槽一下,easy-sms的合约设计应该也是基于这个思路,但是getContent/getTemplate/getData在被实际网关调用的时候根本就没有传递给网关。..好了,我们的开发完成了。发送验证码在创建验证码数据模型时已经添加到“factory”中,所以我们可以直接使用factory函数,发送demo:大功告成,easy-sms是一个很好的封装。以上代码均来自ThinkSNSPlus。完整的开发代码可以看仓库:GitHub:https://github.com/slimkit/th...(开源不易,求Star)源码授权购买当前稳定系统V4系列全终端产品(PC/H5/APP),授权源码购买,产品体验请拨打:18108035545获取开源版源码正式版唯一渠道:关注公众号“thinksns”,回复“OpenSourceVersion”获取最新源码压缩文件地址。TS+安装部署:http://www.thinksns.com/read...