77 lines
2.4 KiB
PHP
77 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace Modules\EcommerceFinance\Services;
|
|
|
|
use App\Models\Settings\DatabaseConnection;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
/**
|
|
* 从系统数据库读取经 Laravel APP_KEY 加密保存的上游连接配置。
|
|
*
|
|
* 本地、开发和测试环境保持可用;生产环境必须通过私有环境变量显式开启。
|
|
*/
|
|
class UpstreamStoredConfiguration
|
|
{
|
|
public const SYSTEM_COMPANY_ID = 0;
|
|
|
|
/** @var array<string, DatabaseConnection|null> */
|
|
private array $connections = [];
|
|
|
|
public function editable(): bool
|
|
{
|
|
return app()->environment(['local', 'development', 'testing'])
|
|
|| (bool) config('upstreams.stored_configuration.enabled', false);
|
|
}
|
|
|
|
public function find(string $source): ?DatabaseConnection
|
|
{
|
|
if (! $this->editable()) {
|
|
return null;
|
|
}
|
|
|
|
if (array_key_exists($source, $this->connections)) {
|
|
return $this->connections[$source];
|
|
}
|
|
|
|
if (! Schema::hasTable('system_database_connections')) {
|
|
return $this->connections[$source] = null;
|
|
}
|
|
|
|
$this->connections[$source] = DatabaseConnection::query()
|
|
->where('company_id', self::SYSTEM_COMPANY_ID)
|
|
->where('source_key', $source)
|
|
->first();
|
|
|
|
return $this->connections[$source];
|
|
}
|
|
|
|
public function forget(string $source): void
|
|
{
|
|
unset($this->connections[$source]);
|
|
}
|
|
|
|
public function value(string $source, string $path, mixed $default = null): mixed
|
|
{
|
|
$connection = $this->find($source);
|
|
|
|
if (! $connection) {
|
|
return $default;
|
|
}
|
|
|
|
return match (trim($path, '.')) {
|
|
'enabled' => $connection->enabled,
|
|
'allowed_scopes' => $connection->allowed_scopes ?? [],
|
|
'connection.host' => $connection->host,
|
|
'connection.port' => $connection->port,
|
|
'connection.database' => $connection->database_name,
|
|
'connection.username' => $connection->username,
|
|
'connection.password' => $connection->password,
|
|
'connection.odbc_driver' => $connection->odbc_driver,
|
|
'connection.tds_version' => $connection->tds_version,
|
|
'connection.connect_timeout' => $connection->connect_timeout,
|
|
'connection.query_timeout' => $connection->query_timeout,
|
|
default => $default,
|
|
};
|
|
}
|
|
}
|