在 Laravel 中 “规范” 的开发短信验证码发送功能


Posted in PHP onOctober 26, 2017

Laravel简介

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数据的完全控制,而且享受到ActiveRecord的所有便利。Eloquent原生支持Fluent中查询构造器(query-builder)的所有方法。

 Laravel 中 “规范” 的开发短信验证码发送功能需求场景

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

完成

首先,在 Laravel 中的规范就是使用 Laravel 的「消息通知」,这里基于场景为「验证码」。这个需求几乎所有软件系统都有使用到。

创建通知场景

第一步,使用 php artisan make:notification 创建一个通知类,创建成功后默认已经存在了三个方法 via、toMail 和 toArray ,因为是发送验证码,姑将这个控制类命名为 VerificationCode 。

然后创建一个验证码数据模型和数据表迁移,可以使用 php artisan make:model \"VerificationCode\" -m 直接快速创建数据模型和迁移。

ThinkSNS+的迁移如下:

在 Laravel 中 “规范” 的开发短信验证码发送功能

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

在 Laravel 中 “规范” 的开发短信验证码发送功能

从代码里面,可以看到我们还添加了「软删除」,因为是基于手机号或者邮箱的验证码发送,所以不需要其他的内置花花肠子,也不需要记录到 「消息通知数据表」中,所以 routeNotificationFor 方法我们选择直接返回需要发送的账号(手机号或邮箱)。

加入工厂模式,快捷发送

打开 database/factories/ModelFactory.php 在里面添加一个关于通知数据模型的工厂定义:

在 Laravel 中 “规范” 的开发短信验证码发送功能

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

在 Laravel 中 “规范” 的开发短信验证码发送功能

我们选择方式就是直接返回 channel 值,这个值可以是任何值,只要我们实现了这个通知频道,都可以发送,而Laravel已经内置和一些发送频道 database、mail 和 nexmo

完成邮件验证码发送

其实,这个步骤我们要做的事情已经很少了,生产通知类的时候,已经完成了 toMail 方法,所以,我们直接修改其消息内容即可。

完成短信验证码发送

短信发送我们采用 overtrue/easy-sms 包,这是安正超开发的一个短信发送客户端,已经内置了很多短信平台,实现也很优秀。(吐槽:虽然有些细节有问题,例如不按照契约调用方法传递网关)

首先依赖短信发送客户端包composer require overtrue/easy-sms然后新建配置 /config/sms.php ,内容嘛,就按照 easy-sms 首页的说明增加即可,先贴出我们的配置内容(为了减少文章字数,只保留阿里大于配置):

在 Laravel 中 “规范” 的开发短信验证码发送功能

在 Laravel 中 “规范” 的开发短信验证码发送功能

我门增加了一个 channel 配置,用于不同场景,例如验证码场景 code 以方便消息器读取配置。

然后打开 AppServiceProvider.php 在 register 中增加如下:

在 Laravel 中 “规范” 的开发短信验证码发送功能

至此 EasySms 在 Laravel 中的集成已经完成,但是还没有开发实际功能,我们接着往下看。

开发 sms 发送频道

为什么要开发?首先,easy-sms 支持的很多,可以考虑单独为每个发送平台开发一个通知发送频道类,也可以采用只开发一个 sms 发送频道类,我们选择开发一个sms通知发送类,通过 easy-sms 的策略机制去多平台发送验证码。

首先,新建一个 app/Notifications/Channels/SmsChannel.php 文件,因为 Laravel 没有提供生成函数,这个需要自己创建哟,只要实现 send 方法即可。 SmsChannel 内容如下:

在 Laravel 中 “规范” 的开发短信验证码发送功能

这样基于 easy-sms 的 短信通知发送频道已经完成。

开发场景发送消息

这部分完全属于 easy-sms 使用开发,我们新建一个 VerificationCodeMessage.php ,内容如下:

在 Laravel 中 “规范” 的开发短信验证码发送功能

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

在 Laravel 中 “规范” 的开发短信验证码发送功能

场景配置,例如验证码不同频道的 template 等,这样消息器就可以根据发送网关来判断使用场景的配置是什么。

再次吐槽,easy-sms 的契约设计也应该是这个思想,但是 getContent/getTemplate/getData 在实际网关调用的时候根本没有传递网关过来。。。

好了我们的开发完成了。

发送验证码

在创建验证码数据模型的时候就已经添加到「工厂」中,所以我们可以直接使用 factory 函数了,发送演示:

在 Laravel 中 “规范” 的开发短信验证码发送功能

大功告成,easy-sms 是一个很不错的包哟。

上面代码都是来自于 ThinkSNS Plus ,看完整的开发代码可以看仓库:

GitHub: https://github.com/slimkit/thinksns-plus

总结

以上所述是小编给大家介绍的在 Laravel 中 “规范” 的开发短信验证码发送功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php读取30天之内的根据算法排序的代码
Apr 06 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
PHP APC的安装与使用详解
Jun 13 PHP
解析Win7 XAMPP apache无法启动的问题
Jun 26 PHP
PHP函数in_array()使用详解
Aug 20 PHP
php绘制一个矩形的方法
Jan 24 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 PHP
PHP __call()方法实现委托示例
May 20 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 #PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 #PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
Oct 26 #PHP
利用php获得flv视频长度的实例代码
Oct 26 #PHP
PHP 中魔术常量的实例详解
Oct 26 #PHP
yii框架redis结合php实现秒杀效果(实例代码)
Oct 26 #PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 #PHP
You might like
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
配置支持SSI
2006/11/25 PHP
PHP中的cookie
2006/11/26 PHP
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
php命令行模式代码实例详解
2021/02/26 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
Js中使用hasOwnProperty方法检索ajax响应对象的例子
2014/12/08 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
2018/10/20 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
工程师求职简历的自我评价分享
2013/10/10 职场文书
食品安全工作实施方案
2014/03/26 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
教师个人年终总结
2015/02/11 职场文书
事业单位聘任报告
2015/03/02 职场文书
2015年法制宣传月活动总结
2015/03/26 职场文书
Python实现将多张图片合成MP4视频并加入背景音乐
2022/04/28 Python