在 ThinkPHP 5.1 中,若要根据配置文件 sms.conf 中的设置在不同的短信渠道之间进行切换,可以采用以下步骤:

第一步:定义接口

首先,创建一个接口,这个接口将由所有短信渠道类实现。这样可以保证所有短信渠道类都具有相同的签名,即都必须实现发送短信的方法。

Php

深色版本
1// SmsInterface.php
2namespace app\lib\sms;
3
4interface SmsInterface {
5 public function send($to, $message);
6}

第二步:实现接口

接下来,为每个短信渠道创建一个类,并实现上述接口。

Php

深色版本
1// AliyunSms.php
2namespace app\lib\sms;
3
4class AliyunSms implements SmsInterface {
5 public function send($to, $message) {
6 // 阿里云短信发送逻辑
7 }
8}
9
10// TencentSms.php
11namespace app\lib\sms;
12
13class TencentSms implements SmsInterface {
14 public function send($to, $message) {
15 // 腾讯云短信发送逻辑
16 }
17}

第三步:配置文件

在配置文件中,你可以指定默认使用的短信渠道,以及每个渠道的配置信息。

Php

深色版本
1// config/sms.php
2return [
3 'default' => env('sms.default_channel', 'aliyun'), // 默认使用阿里云
4 'channels' => [
5 'aliyun' => [
6 'class' => 'app\lib\sms\AliyunSms',
7 'options' => [
8 // 阿里云相关配置
9 ],
10 ],
11 'tencent' => [
12 'class' => 'app\lib\sms\TencentSms',
13 'options' => [
14 // 腾讯云相关配置
15 ],
16 ],
17 ],
18];

第四步:使用服务容器

common.php 文件中,你可以使用 ThinkPHP 的服务容器来注册短信服务,使其可以根据配置文件中的设置自动实例化正确的短信渠道。

Php

深色版本
1// common.php
2use think\Container;
3use think\Config;
4
5Container::set('sms', function () {
6 $channel = Config::get('sms.default');
7 $channelInfo = Config::get("sms.channels.$channel");
8 return new $channelInfo['class']($channelInfo['options']);
9});

第五步:在应用中使用

现在,你可以在应用中通过服务容器获取短信服务,并调用其发送方法。

Php

深色版本
1use think\Container;
2
3$container = Container::getInstance();
4$sms = $container->get('sms');
5$sms->send('1234567890', 'Hello World!');

这样,你就可以在 .env 文件中更改默认的短信渠道,而无需修改任何代码。

Bash

深色版本
1# .env 文件
2sms.default_channel=tencent

这种方式允许你轻松地在不同的短信渠道之间切换,只需要修改配置即可,而不需要改变代码逻辑。

方式二:

配置驱动的工厂模式是一种常用的设计模式,它允许你在运行时根据配置信息来创建对象。这种模式特别适用于需要根据外部条件(如配置文件、环境变量等)选择创建不同类型对象的场景。下面是如何在ThinkPHP 5.1中实现配置驱动的工厂模式的步骤:

第一步:定义接口或抽象类

首先,定义一个接口或抽象类,所有短信渠道类都应实现或继承这个接口或抽象类。这样可以确保所有实现类具有相同的方法签名。

Php

深色版本
1// SmsInterface.php
2namespace app\lib\sms;
3
4interface SmsInterface {
5 public function send($to, $message);
6}

第二步:实现具体的短信渠道类

创建两个实现 SmsInterface 的类,代表不同的短信渠道。

Php

深色版本
1// AliyunSms.php
2namespace app\lib\sms;
3
4class AliyunSms implements SmsInterface {
5 public function send($to, $message) {
6 // 实现阿里云短信发送逻辑
7 }
8}
9
10// TencentSms.php
11namespace app\lib\sms;
12
13class TencentSms implements SmsInterface {
14 public function send($to, $message) {
15 // 实现腾讯云短信发送逻辑
16 }
17}

第三步:配置短信渠道

在配置文件中定义短信渠道的映射和默认渠道。

Php

深色版本
1// config/sms.php
2return [
3 'channels' => [
4 'aliyun' => [
5 'class' => 'app\lib\sms\AliyunSms',
6 'options' => [
7 // 阿里云配置选项
8 ]
9 ],
10 'tencent' => [
11 'class' => 'app\lib\sms\TencentSms',
12 'options' => [
13 // 腾讯云配置选项
14 ]
15 ],
16 ],
17 'default' => env('sms.default_channel', 'aliyun'), // 默认使用阿里云
18];

第四步:创建工厂类

创建一个工厂类,该类负责根据配置创建具体的短信渠道实例。

Php

深色版本
1// SmsFactory.php
2namespace app\lib\sms;
3
4class SmsFactory {
5 public static function create($channelName = null) {
6 if (is_null($channelName)) {
7 $channelName = config('sms.default');
8 }
9
10 $channelConfig = config("sms.channels.$channelName");
11
12 $class = $channelConfig['class'];
13 $options = $channelConfig['options'] ?? [];
14
15 return new $class($options);
16 }
17}

第五步:在应用中使用工厂

在你的应用中,你可以使用工厂来创建短信渠道实例并发送短信。

Php

深色版本
1// 控制器或服务层
2use app\lib\sms\SmsFactory;
3
4$channelName = 'aliyun'; // 或从配置中读取
5$sms = SmsFactory::create($channelName);
6$sms->send($to, $message);

这样,你可以通过更改配置文件中的 sms.default_channel 设置来切换默认的短信渠道,而无需修改任何代码。如果需要,你还可以在运行时动态选择不同的短信渠道。

在 Laravel 11 中,如果你想方便地在阿里云和腾讯云的短信服务之间切换,可以采取依赖注入和服务提供者的策略。首先,你需要定义一个接口,这个接口将描述短信服务所需的所有方法。然后,为阿里云和腾讯云的短信服务分别实现这个接口。最后,通过服务容器在配置中动态绑定和切换实现。

下面是详细的步骤:

  1. 定义接口:

    创建一个接口,例如 SmsServiceInterface,它将定义短信服务所需的方法。

    Php

    深色版本
    1namespace App\Services;
    2
    3interface SmsServiceInterface
    4{
    5 public function send(string $to, string $message): bool;
    6}
  2. 实现接口:

    分别为阿里云和腾讯云创建实现类。

    对于阿里云:

    Php

    深色版本
    1namespace App\Services;
    2
    3use App\Services\SmsServiceInterface;
    4
    5class AliyunSmsService implements SmsServiceInterface
    6{
    7 public function send(string $to, string $message): bool
    8 {
    9 // 实现阿里云的短信发送逻辑
    10 // ...
    11 }
    12}

    对于腾讯云:

    Php

    深色版本
    1namespace App\Services;
    2
    3use App\Services\SmsServiceInterface;
    4
    5class TencentSmsService implements SmsServiceInterface
    6{
    7 public function send(string $to, string $message): bool
    8 {
    9 // 实现腾讯云的短信发送逻辑
    10 // ...
    11 }
    12}
  3. 创建服务提供者:

    创建一个服务提供者,例如 SmsServiceProvider,用于注册服务。

    Php

    深色版本
    1namespace App\Providers;
    2
    3use Illuminate\Support\ServiceProvider;
    4use App\Services\SmsServiceInterface;
    5use App\Services\AliyunSmsService;
    6use App\Services\TencentSmsService;
    7
    8class SmsServiceProvider extends ServiceProvider
    9{
    10 public function register()
    11 {
    12 $this->app->singleton(SmsServiceInterface::class, function () {
    13 $driver = config('services.sms.driver');
    14
    15 switch ($driver) {
    16 case 'aliyun':
    17 return new AliyunSmsService();
    18 case 'tencent':
    19 return new TencentSmsService();
    20 default:
    21 throw new \InvalidArgumentException("Invalid SMS driver.");
    22 }
    23 });
    24 }
    25}
  4. 配置绑定:

    config/app.phpproviders 数组中注册 SmsServiceProvider

    Php

    深色版本
    1'providers' => [
    2 // ...
    3 App\Providers\SmsServiceProvider::class,
    4],
  5. 配置切换:

    创建或编辑 config/services.php 文件,添加短信服务的配置。

    Php

    深色版本
    1return [
    2 'sms' => [
    3 'driver' => env('SMS_DRIVER', 'aliyun'),
    4 ],
    5];

    然后在 .env 文件中设置 SMS_DRIVER 的值为 'aliyun''tencent'

  6. 使用服务:

    在需要使用短信服务的地方,通过依赖注入获取 SmsServiceInterface 的实例。

    Php

    深色版本
    1public function __construct(SmsServiceInterface $smsService)
    2{
    3 $this->smsService = $smsService;
    4}
    5
    6public function sendSms(string $to, string $message)
    7{
    8 return $this->smsService->send($to, $message);
    9}

通过上述步骤,你可以在不修改任何业务逻辑代码的情况下,仅仅通过修改 .env 文件中的 SMS_DRIVER 配置,就能在阿里云和腾讯云的短信服务之间进行切换。

php 选择驱动写法的更多相关文章

  1. linux 字符设备驱动写法

    字符设备,块设备书 一.register_chrdev_region, register_chrdev, misc_register misc device(杂项设备) 在 Linux 内核的incl ...

  2. jdbc 各驱动写法

    1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); ...

  3. 字符设备驱动另一种写法—mmap方法操作LED

    最近在看韦老师的视频,讲解了很多种字符设备的驱动写法.经过自己的研究之后,我发现还有另外一种写法,直接在应用层操作,省去了内核中的地址映射部分,使得用户可以在应用层直接操作LED.        mm ...

  4. linux platform设备与驱动

    struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_devic ...

  5. win7 64位系统HP LaserJet P1008 / HP LaserJet P1008 P1007 驱动安装成功,但无法打印的原因

    HP LaserJet P1008 打印机驱动安装成功,但是无法打印相关文档的原因是: 1.打印机是水货,惠普中国提供的驱动和该打印机不符合.显示的应该是HP LaserJet Professiona ...

  6. AHCI驱动安装

    目录 第1章 Windows XP    1 1.1 更新驱动    1 第2章 Windows 7    7 2.1 修改注册表    7 2.2 更新驱动    7 第1章 Windows XP ...

  7. 轻松解决fedora21装完NVIDIA显卡驱动后无法进入gnome问题

    本来打算昨天写的,最近感冒了,打点滴,耽搁了! 我用的是联想14寸笔记本,装好了fedora21后,想装个NVIDIA显卡驱动试试,结果和很多人一样无法进入gnome界面,搞了三四个小时终于搞定.下面 ...

  8. windows设备驱动安装指南

    高观点下的设备驱动安装(overview) 一.windows是怎样安装设备的? 第一步:新设备的识别 在给一个新设备安装驱动之前,总线或集线器(hub)驱动会为连接到PC上的设备分配一个硬件ID(h ...

  9. VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)

    ------------VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)------------- WIN10已上线,随之而来的是VS2015:微软在 "WDK760 ...

  10. MOSFET与MOSFET驱动电路原理及应用(转)

    源:http://www.micro-bridge.com/news/news.asp?id=258 在使用MOS管设计开关电源或者马达驱动电路的时候,大部分人都会考虑MOS的导通电阻,最大电压等,最 ...

随机推荐

  1. HTML——基本标签

    1.标题标签 <h1>标题1</h1> <h2>标题2</h2> <h3>标题3</h3> <h4>标题4</ ...

  2. kubernetes 二次开发-认证,鉴权(1)

    基于webhook的认证 授权过程 认证授权服务需要满足如下kubernetes的规范 kubernetes api-server组件发送 http post 请求 url:https://authn ...

  3. 初识c语言—c语言的初步认识和一个简单的程序

    C语言是什么 编程语言(编程语言是控制计算机的一系列指令,他又固定的格式和词汇.同时也叫计算机语言(计算机语言是,人和计算机通讯的语言)) C语言的特点 语言简洁,紧凑,使用方便 运算符丰富 数据类型 ...

  4. vue3 Suspense

    在Vue.js 3中,Suspense 是一个用于处理异步组件的特殊组件,它允许你在等待异步组件加载时展示备用内容.这对于优化用户体验.处理懒加载组件或异步数据获取时非常有用.Suspense 的主要 ...

  5. 带你了解磁盘驱动程序(xv6)

    磁盘驱动程序 本文来聊聊磁盘驱动程序,驱动程序是硬件的接口,操作系统通过这个接口来控制硬件工作,所以驱动程序就好比是硬件和系统之间的桥梁.这是百科上给出的解释,可能看起来还是云里雾里,我来做做注解. ...

  6. 10位,13位时间戳转为C#.NET格式时间 DateTime

    10位,13位时间戳转为C#.NET格式时间 DateTime - public static DateTime ToDateTime( string timestamp) { var tz = Ti ...

  7. 使用 OpenTelemetry 构建可观测性 01 - 介绍

    毫无疑问,在过去几年里,你可能已经多次听到过可观测性这个词.对于很多人来说,很难理解这个词的真正含义.对许多人来说,他们错误地将其等同于"监控".虽然可观测性的根本定义以及它所包含 ...

  8. SRE心里话:要求100%服务可用性就是老板的无知

    <SRE Google 运维解密>第3章讲了拥抱风险,一些关键的观点,在这里与大家分享,融入了我自己的一些理解,希望对你有些帮助. 服务可用性必须100%?其实完全没必要 一个服务客户的产 ...

  9. 百度面试:如何用Redis实现限流?

    高并发系统有三大特征:限流.缓存和熔断,所以限流已经成为当下系统开发中必备的功能了.那么,什么是限流?如何实现限流?使用 Redis 能不能实现限流?接下来我们一起来看. 1.什么是限流? 限流是指在 ...

  10. 项目管理--PMBOK 读书笔记(8)【项目质量管理】

    1.数据表现-流程图: 流程图也称为过程图,用来显示在一个或者多个输入转化为一个或者多个输入出的过程. 2.质量工具图比较: 发现问题:控制图(七点规则等).趋势图 寻找原因:因果图.流程图 分析原因 ...