您现在的位置是:网站首页 > 心得笔记
工厂模式
简介场景:使用工厂模式接入:阿里短信验证、腾讯短信验证、百度短信验证
创建类文件
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){ // 阿里云短信服务代码 // TODO return '阿里云短信验证码发送成功'; } }
BaiduSMS.php – 百度短信服务类 class BaiduSMS implements BaseSMS { public static function sendCode($phone, $code){ // 百度云短信服务代码 // TODO return '百度云短信验证码发送成功'; } }
TencentSMS.php – 腾讯短信服务类 class TencentSMS implements BaseSMS { public static function sendCode($phone, $code){ // 腾讯云短信服务代码 // TODO return '腾讯云短信验证码发送成功'; } }
SmsBusiness.php – 短信业务逻辑类 class SmsBusiness { public static function sendCode($phone, $len = 4, $type){ // 生成短信验证码 $code = mt_rand(1000,9999); // 默认为4位数验证码 if ($len == 4){ // 长度为4,则生成4位数验证码 $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($phone, config('code.code.length'), 'ali')){ return show(config('status.success'), '验证码发送成功'); } return show(config('status.error'), '验证码发送失败'); } }
实际工作中经常使用的是:对于数据量很大的列表,需要根据需求选择维度小的作为查询主连接
public listByParams($params['orderStatus']) { switch ((int)$params['orderStatus']) { case 1://已审核 case 2://未审核 $data = OrderExt::getListByStatus($params['orderStatus']); break; case 3://未签协议 case 4://已签协议 $data = ProtocolStudent::getListByStatus($params['orderStatus']); default; } }