場景:使用工廠模式接入:阿里短信驗證、騰訊短信驗證、百度短信驗證
創建類文件
BaseSMS.php
– 基礎短信服務接口類AliSMS.php
– 阿里短信服務類BaiduSMS.php
– 百度短信服務類TencentSMS.php
– 騰訊短信服務類SmsBusiness.php
– 短信業務邏輯類
具體代碼
BaseSMS.php
– 基礎短信服務接口類
interface BaseSMS
{
public static function sendCode($phone, $code);
}
AliSMS.php
– 阿里短信服務類
class AliSMS implements BaseSMS
{
public static function sendCode($phone, $code){
// 這裏是阿里雲短信服務代碼
// XXXXXXXXXXXXXXXXXXXXX
return '阿里雲短信驗證碼發送成功';
}
}
BaiduSMS.php
– 百度短信服務類
class BaiduSMS implements BaseSMS
{
public static function sendCode($phone, $code){
// 這裏是百度雲短信服務代碼
// XXXXXXXXXXXXXXXXXXXXX
return '百度雲短信驗證碼發送成功';
}
}
TencentSMS.php
– 騰訊短信服務類
class TencentSMS implements BaseSMS
{
public static function sendCode($phone, $code){
// 這裏是騰訊雲短信服務代碼
// XXXXXXXXXXXXXXXXXXXXX
return '騰訊雲短信驗證碼發送成功';
}
}
SmsBusiness.php
– 短信業務邏輯類
class SmsBusiness
{
public static function sendCode($phone, $len = 4, $type){
// 生成短信驗證碼
$code = mt_rand(1000,9999); // 默認爲4位數驗證碼
if ($len == 6){ // 長度爲6,則生成6位數驗證碼
$code = mt_rand(100000,999999);
}
// 工廠模式創建不同的短信服務商
$smsObj = null;
switch($type){
case 'ali':
$smsObj = new AliSMS();
break;
case 'baidu':
$smsObj = new BaiduSMS();
break;
case 'tencent':
$smsObj = new TencentSMS();
break;
}
$sms = $smsObj::sendCode($phone, $code);
if ($sms) {
// 成功:把短信驗證碼記錄到 redis, 並且設置失效時間
cache(config('stores.redis.prefix') . $phone, $code, config('stores.redis.expire'));
}
return true;
}
}
最後,控制器調用 業務邏輯層短信發送驗證碼服務
class SMSController {
public function code (){
$phone = request()->param('phone_number', '', 'trim');
/*
* 這裏是參數驗證,略
*/
// 調用業務邏輯層的sendCode
if (SmsBusiness::sendCode($phoneNumber, config('code.code.length'), 'ali')){
return show(config('status.success'), '驗證碼發送成功');
}
return show(config('status.error'), '驗證碼發送失敗');
}
}
------- THE END -------