php 选择驱动写法

在 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 配置,就能在阿里云和腾讯云的短信服务之间进行切换。

posted @ 2024-07-12 16:24  猫猫客服  阅读(4)  评论(0编辑  收藏  举报