挂海论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
 友情提示:文字/图片广告均非网站意见,请担保交易勿直接付款,由此产生的责任自负
玩游戏来117游戏网(H5不下载也能玩手游传奇,吃鸡,竞技都有)不懂社区·好资源不错过·各位资源站大佬欢迎来采集搬运寻找会做《单机》游戏修改器的开发作者长期合作,价格不是问题!联系QQ:1874088565 ██【我要租此广告位】██
... .
查看: 2794|回复: 0
打印 上一主题 下一主题

[讨论交流] 如何在 Laravel 中 “规范” 的开发验证码发送功能

[复制链接]
4中级会员
543/600

543

积分

79

主题

5

听众
已帮网友解决1 个问题
好评
-6
贡献
464
海币
1155
交易币
0

最佳新人推广达人热心会员开荒者宣传达人原创大师签到达人

QQ
跳转到指定楼层
楼主
发表于 2020-3-28 17:57:00 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
提醒:若下载的软件是收费的"请不要付款",可能是骗子,请立即联系本站举报,执意要付款被骗后本站概不负责。(任何交易请走第三方中介,请勿直接付款交易以免被骗!切记).

友情提示:文字/图片广告均非本站意见,请担保交易勿直接付款,由此产生的责任自负!!!↑↑


如何在 Laravel 中 “规范” 的开发验证码发送功能
                                                                                        什么是ThinkSNS ?

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

需求场景

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

完成

首先,在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 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+ 是如何计算字符显示长度的
下一篇:如何在 Laravel 中 “规范” 的开发验证码发送功能
免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.52ghai.com无关。

2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

4、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:xhzlw@foxmail.com),本站将立即改正。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明|Archiver|手机版|小黑屋|挂海论坛

GMT+8, 2025-4-21 12:22 , Processed in 0.082636 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

本站资源来自互联网用户收集发布,如有侵权请邮件与我们联系处理。xhzlw@foxmail.com

快速回复 返回顶部 返回列表