I'm working on dynamically setting the default database connection in CodeIgniter 4 using AWS Secrets Manager. I want to generate the default group array using AWS Secrets Manager and override the database connection as the default.
To fetch AWS Secrets In your controller or service class, fetch the AWS Secrets from AWS Secrets Manager:
use Aws\SecretsManager\SecretsManagerClient;
$secretsManager = new SecretsManagerClient(['region' => 'your_aws_region','version' => 'latest',]);
$secret = $secretsManager->getSecretValue(['SecretId' => 'your_secret_name']);$secrets = json_decode($secret['SecretString'], true);
Override the default database configuration dynamically:
$defaultConfig = [
'DSN' => '',
'hostname' => $secrets['db_host'] ?? 'localhost',
'username' => $secrets['db_username'] ?? '',
'password' => $secrets['db_password'] ?? '',
'database' => $secrets['db_name'] ?? '',
// ... other database configuration options
];
I don't want to load any where in controller or Model. How can I achieve this, in CodeIgniter 4
Created a New Database Configuration Class:
Created a new file for your custom configuration class, e.g., CustomDatabaseConfig.php. Place this file in the App\Config directory.
// app/Config/CustomDatabaseConfig.php
namespace Config;
use Aws\SecretsManager\SecretsManagerClient;
class CustomDatabaseConfig extends \CodeIgniter\Config\Database
{
public function __construct()
{
// Fetch AWS Secrets Manager credentials
$secretsManager = new SecretsManagerClient([
'region' => 'your_aws_region',
'version' => 'latest',
]);
$secret = $secretsManager->getSecretValue(['SecretId' => 'your_secret_name']);
$secrets = json_decode($secret['SecretString'], true);
// Populate the dynamic configuration
$this->default['hostname'] = $secrets['db_host'];
$this->default['username'] = $secrets['db_username'];
$this->default['password'] = $secrets['db_password'];
$this->default['database'] = $secrets['db_name'];
parent::__construct(); // Call parent constructor
}
}
Configure Default Database Group in App Configuration:
Open
app/Config/App.php.Set the default database group to your custom database group.
Replace
'custom'with the name you used for your custom database group.
// app/Config/App.php
public $defaultDatabaseGroup = 'custom';
Update Classmap in App Configuration:
Open
app/Config/App.php.Update the
classmaparray to include your custom configuration class.
// app/Config/App.php
public $classmap = [
'Config\Database' => APPPATH . 'Config/CustomDatabaseConfig.php',
];
I am getting following error :
InvalidArgumentException - default is not a valid database connection group.