CaiWuXiTong/modules/EcommerceFinance/Services/UpstreamStoredConfiguration.php

76 lines
2.3 KiB
PHP

<?php
namespace Modules\EcommerceFinance\Services;
use App\Models\Settings\DatabaseConnection;
use Illuminate\Support\Facades\Schema;
/**
* 读取仅供本地开发使用的上游连接配置。
*
* 生产环境始终使用私有环境变量,避免网页配置覆盖服务器运行配置。
*/
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']);
}
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,
};
}
}