什么是ThinkSNS ?

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

需求场景

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

完成

首先,在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 Plus,看完整的开发代码可以看仓库:

GitHub:https://github.com/slimkit/thinksns-plus(开源不易,求Star)

如何在 Laravel 中 “规范” 的开发验证码发送功能的更多相关文章

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

    顺便发个小通知:7月15日ThinkSNS+开源版发布,同时非开源的APP也走出内测阶段,体验二维码也全面发布体验. 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统 ...

  2. 如何在 Laravel 中灵活的使用 Trait

    如何在 Laravel 中灵活的使用 Trait  Laravel/ 3个月前/  1740 /  4 / 更新于 3个月前   @这是小豪的第九篇文章 好久没有更新文章了,说好了周更结果还是被自己对 ...

  3. 详解如何在Laravel中增加自定义全局函数

    http://www.php.cn/php-weizijiaocheng-383928.html 如何在Laravel中增加自定义全局函数?在我们的应用里经常会有一些全局都可能会用的函数,我们应该怎么 ...

  4. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         ...

  5. .NET开发邮件发送功能

    .NET开发邮件发送功能 今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知 ...

  6. 如何在Eclipse中配置python开发环境

    考虑到网上关于Eclipse中配置Python开发环境的文章千篇一律,故写此文以总结. 本文主要内容是:三种Pydev配置方法和一种PyDev卸载方法. 本文的前提是你已经安装了Eclipse和pyt ...

  7. 如何在myeclipse中实现jquery的自动提示功能

    在web开发过程中,myeclipse中jsp可以实现自动提示功能,但是jquery代码却无法实现自动提示,需要自己一个个手动去输入,效率过低,怎么办? 工具/原料   jquery 1.8.3.js ...

  8. 教程:基于Spring快速开发电子邮件发送功能

    在Spring框架的spring-context-support.jar中有对电子邮件发送功能的封装: 基于Spring开发简单省事,而且更稳定.需要mail.jar包支持 @Component pu ...

  9. 如何在Salesforce中进行代码开发

    两种方式: 1):用Salesforce自带的在线开发模式 Setup --> App Setup --> Develop --> than you can select 'Page ...

随机推荐

  1. 《程序员代码面试指南》第八章 数组和矩阵问题 打印N 个数组整体最大的Top K

    题目 打印N 个数组整体最大的Top K java代码 package com.lizhouwei.chapter8; /** * @Description: 打印N 个数组整体最大的Top K * ...

  2. ceres求解BA第10章

    1.前言g2o是根据边来保存每一个代价函数,它是在边类中构造误差函数,构造边的时候,会设置顶点.测量值.协方差矩阵等.而在ceres中,用problem类型来构造最终的目标函数.先是使用AddResi ...

  3. 使用pip安装第三方库报错记录

    今天在使用pycharm导入第三方库的时候,报了好多超时错误,还有标题中的找不到版本,应该是网络的原因,记录下解决的办法: raise ReadTimeoutError(self._pool, Non ...

  4. 版本名称SNAPSHOT、alpha、beta、release、GA含义

    Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用.Beta:也是测试版,这个阶段的版本会一直加入新的功能.在Alpha版之后推出.RC:(Release Candida ...

  5. 杂草丛生HTML5网站模板

    杂草丛生HTML5个人网站模板是一款野草到处生长的HTML5网站模板下载. 模板地址:http://www.huiyi8.com/sc/8780.html

  6. 2013各大IT公司薪资标准

    以此鼓励自己 :http://jinhua.19lou.com/forum-874-thread-115901362964023509-1-1.html   以下三个是老大级别的公司   [微软] 研 ...

  7. BZOJ 1198 [HNOI2006]军机调度:dfs

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1198 题意: 有n个雇佣军,m个任务. 第i个雇佣军能够参加cnt个任务,分别为temp[ ...

  8. Linux(Ubuntu16.04)+GitLab8.17deb安装包搭建Git仓库(代码管理系统)

    1 下载GitLab安装包 2  执行安装命令 3 验证是否安装和启动成功 4 修改管理员密码 5 其它说明 5.1修改访问URL 5.2修改邮件配置 5.3修改web端口 1下载GitLab安装包 ...

  9. Qt容器组件(二)之QWidgetStack、QMdiArea、QDockWidget

    QT中有九种容器组件,分别是组合框QGroupBox.滚动区QScrollArea.工具箱QToolBox.选项卡QTabWidget.控件栈QWidgetStack.框架QFrame.组件QWidg ...

  10. ACM学习历程—BestCoder 2015百度之星资格赛1006 单调区间(组合数学)

    Problem Description 百小度最近在逛博客,然后发现了一个有趣的问题. 如下图所示,是一个12 位数014326951987 , 它的数字先逐渐变大, 然后变小,再变大,接着变小,又变 ...