在 PHP 中获取凭据

Fetching Credentials in PHP

我正在开发一个 Laravel 应用程序,该应用程序可以发送 SMS,并具有其他几个集成功能。集成是按组织 table 中列出的公司进行的。我已经创建了一个 table 集成,并将那些与组织 table 有关系的集成链接起来。

有更好的方法吗?以某种方式重构?我正在考虑使用扩展 Twilio 客户端 class 的 class,然后将凭据放在那里。所以调用 TwilioClient 会很简单,仅此而已。在后端 (class),它将完成检查数据库和获取凭据的所有繁重工作。

现在这就是我所拥有的。

    public function test()
    {
        $integration = Integration::where('provider', '=', 'Twilio')->first();
        $credentials = $integration->credentials;
        $client = new Client($credentials['sid'], $credentials['token']);
        $s = $client->lookups->v1->phoneNumbers("+14801234567")->fetch(
              ["addons" => ["ekata_reverse_phone"]]);
        return $s->addOns;
    }

理想情况下,我想避免将此代码放在每个具有集成的区域中。 Twilio 只是一个例子。它可以是 AWS、Azure 或任何其他 PHP/REST/Graph 集成等

$integration = Integration::where('provider', '=', 'Twilio')->first();
        $credentials = $integration->credentials;
        $client = new Client($credentials['sid'], $credentials['token']);

如果能像这样调用就好了:

$client = new IntegrationClient('Twilio');

从那里可以完成后端的所有工作。

感谢您的耐心等待。我仍在学习这方面的知识,非常感谢任何帮助。

根据我们的评论。

我觉得每个 class 您正在使用的集成都已经明确知道它需要哪个集成;它只需要为您的租户配置一个。

我通常这样做(并且已经使用 Twilio)的方式是将 Twilio 客户端的实例绑定到具有凭据和所有客户端的实例化版本。

我认为这在您的代码中的工作方式是这样的:

// AppServiceProvider.php

// In your boot function

$this->app->bind(Client::class, function () {
    $integration = Integration::where('provider', 'Twilio')->first();
    $credentials = $integration->credentials;
    new Client($credentials['sid'], $credentials['token']));
});

现在您的 class 需要使用 Twilio:

private $client;

public function __construct(Client $client)
{
    $this->client = $client;
}

public function test()
{
    $s = $this->client->lookups->v1->phoneNumbers("+14801234567")->fetch(
         ["addons" => ["ekata_reverse_phone"]]
    );
    return $s->addOns;
}

AppServiceProvider 中的绑定将告诉 Laravel 容器,每当 class 请求 Twilio 客户端时,执行该回调并提供结果。 这意味着您的 class 收到客户端的实例化版本,而不是未配置的版本。