php工廠模式使用場景

場景:使用工廠模式接入:阿里短信驗證、騰訊短信驗證、百度短信驗證

創建類文件

  1. BaseSMS.php – 基礎短信服務接口類
  2. AliSMS.php – 阿里短信服務類
  3. BaiduSMS.php – 百度短信服務類
  4. TencentSMS.php – 騰訊短信服務類
  5. 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 -------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章