在 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 收到客户端的实例化版本,而不是未配置的版本。
我正在开发一个 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 收到客户端的实例化版本,而不是未配置的版本。