在 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 相关文章推荐
PHP5中MVC结构学习
Oct 09 PHP
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
一个PHP+MSSQL分页的例子
Oct 09 PHP
模仿OSO的论坛(二)
Oct 09 PHP
小偷PHP+Html+缓存
Dec 20 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
php计算两个坐标(经度,纬度)之间距离的方法
Apr 17 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
php单例模式的简单实现方法
Jun 10 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 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
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
vue项目中跳转到外部链接的实例讲解
2018/09/20 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
Nodejs核心模块之net和http的使用详解
2019/04/02 NodeJs
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
2020/02/29 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
平面设计岗位职责
2013/12/14 职场文书
2014信息技术专业毕业生自我评价
2014/01/17 职场文书
陈欧的广告词
2014/03/18 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
学历公证书范本
2014/04/09 职场文书
终止劳动合同协议书
2014/04/14 职场文书
任命书怎么写
2014/06/04 职场文书
2014年学生工作总结
2014/11/20 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
你需要掌握的20个Python常用技巧
2022/02/28 Python
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android