Add setInstance() support for runtime database switching
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 新手友好度
- 35/100
- Issue 类型
- 功能
- 描述清晰度
- 基本清楚
- 活跃度
- 停滞
- 技术栈
- mysql, php
调研方向
从 system/Database/Config.php 开始,阅读现有的 Config::connect() 流程,包括 ensureFactory()、factory 加载调用以及实例存储。将提议的 setInstance() 行为与该流程进行比较,并确定自定义配置以及后续 connect('tenant') 调用的验收情况。
由索引模型根据 Issue 内容生成。
描述
PHP Version
8.3
CodeIgniter4 Version
4.6.1
CodeIgniter4 Installation Method
Composer (using codeigniter4/appstarter)
Which operating systems have you tested for this bug?
Windows
Which server did you use?
apache
Database
MySQL
What happened?
I would like to request a new method in Config\Database that allows developers to set or override a database connection instance at runtime without modifying the framework core.
This is especially useful when a project needs dynamic database switching, such as in:
Multi-tenant SaaS applications
ERP systems with client-specific databases
“Switch DB per request” API requirements
Dynamic “connect with custom credentials” scenarios
Currently, CodeIgniter 4 allows Database::connect($group) but there is no official method to replace or inject a database instance for a given group.
Proposed Method
Add this method in system/Database/Config.php:
public static function setInstance(string $group, array $config)
{
static::ensureFactory();
$connection = static::$factory->load($config, $group);
static::$instances[$group] = $connection;
return $connection;
}
Why this is needed
Today, Database::connect() always loads config from app/Config/Database.php.
To use a custom connection (hostname, username, password, database), we must create a fake group name or override config objects — both are hacky.
Dynamic DB switching is common in modern SaaS, ERP, and enterprise applications.
This addition would provide a clean, supported API for runtime DB instance control.
Example Use Case
$dbConfig = [
'DSN' => '',
'hostname' => $tenantHost,
'username' => $tenantUser,
'password' => $tenantPass,
'database' => $tenantDb,
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
];
$connection = \Config\Database::setInstance('tenant', $dbConfig);
$db = \Config\Database::connect('tenant');
This gives developers the power to switch databases safely and officially.
Backward Compatibility
This method does not change any existing behavior.
It only adds a new optional utility method.
No BC breaks.
Conclusion
This feature will make CodeIgniter 4 significantly more flexible for advanced and enterprise applications that require dynamic DB switching.
Thank you for considering this enhancement! 🙏
Steps to Reproduce
I would like to request a new method in Config\Database that allows developers to set or override a database connection instance at runtime without modifying the framework core.
This is especially useful when a project needs dynamic database switching, such as in:
Multi-tenant SaaS applications
ERP systems with client-specific databases
“Switch DB per request” API requirements
Dynamic “connect with custom credentials” scenarios
Currently, CodeIgniter 4 allows Database::connect($group) but there is no official method to replace or inject a database instance for a given group.
Proposed Method
Add this method in system/Database/Config.php:
public static function setInstance(string $group, array $config)
{
static::ensureFactory();
$connection = static::$factory->load($config, $group);
static::$instances[$group] = $connection;
return $connection;
}
Why this is needed
Today, Database::connect() always loads config from app/Config/Database.php.
To use a custom connection (hostname, username, password, database), we must create a fake group name or override config objects — both are hacky.
Dynamic DB switching is common in modern SaaS, ERP, and enterprise applications.
This addition would provide a clean, supported API for runtime DB instance control.
Example Use Case
$dbConfig = [
'DSN' => '',
'hostname' => $tenantHost,
'username' => $tenantUser,
'password' => $tenantPass,
'database' => $tenantDb,
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
];
$connection = \Config\Database::setInstance('tenant', $dbConfig);
$db = \Config\Database::connect('tenant');
This gives developers the power to switch databases safely and officially.
Backward Compatibility
This method does not change any existing behavior.
It only adds a new optional utility method.
No BC breaks.
Conclusion
This feature will make CodeIgniter 4 significantly more flexible for advanced and enterprise applications that require dynamic DB switching.
Thank you for considering this enhancement! 🙏
Expected Output
I would like to request a new method in Config\Database that allows developers to set or override a database connection instance at runtime without modifying the framework core.
This is especially useful when a project needs dynamic database switching, such as in:
Multi-tenant SaaS applications
ERP systems with client-specific databases
“Switch DB per request” API requirements
Dynamic “connect with custom credentials” scenarios
Currently, CodeIgniter 4 allows Database::connect($group) but there is no official method to replace or inject a database instance for a given group.
Proposed Method
Add this method in system/Database/Config.php:
public static function setInstance(string $group, array $config)
{
static::ensureFactory();
$connection = static::$factory->load($config, $group);
static::$instances[$group] = $connection;
return $connection;
}
Why this is needed
Today, Database::connect() always loads config from app/Config/Database.php.
To use a custom connection (hostname, username, password, database), we must create a fake group name or override config objects — both are hacky.
Dynamic DB switching is common in modern SaaS, ERP, and enterprise applications.
This addition would provide a clean, supported API for runtime DB instance control.
Example Use Case
$dbConfig = [
'DSN' => '',
'hostname' => $tenantHost,
'username' => $tenantUser,
'password' => $tenantPass,
'database' => $tenantDb,
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
];
$connection = \Config\Database::setInstance('tenant', $dbConfig);
$db = \Config\Database::connect('tenant');
This gives developers the power to switch databases safely and officially.
Backward Compatibility
This method does not change any existing behavior.
It only adds a new optional utility method.
No BC breaks.
Conclusion
This feature will make CodeIgniter 4 significantly more flexible for advanced and enterprise applications that require dynamic DB switching.
Thank you for considering this enhancement! 🙏
Anything else?
No response
- 主要语言
- PHP
- 星标
- 6k
- 派生
- 2k
- 平均合并
- 2 天 11 小时
- 30 天内合并 PR
- 47
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
codeigniter4/CodeIgniter4 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 72/100
codeigniter4/CodeIgniter4#10616 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 35/100
codeigniter4/CodeIgniter4#10618 ·
维护者通常 1 天内回复
-
难度 3/5 1-2 天 新手友好度 62/100
codeigniter4/CodeIgniter4#10617 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 25/100
codeigniter4/CodeIgniter4#10615 · 1 条评论 ·
维护者通常 1 天内回复
-
bug
难度 4/5 3-5 天 新手友好度 48/100
codeigniter4/CodeIgniter4#10589 · 3 条评论 ·
维护者通常 1 天内回复
查看 codeigniter4/CodeIgniter4 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 79/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 69/100
bagisto/bagisto-api#54 ·
-
难度 2/5 1-3 小时 新手友好度 82/100
grokability/snipe-it#19869 · 2 条评论 ·
维护者通常 1 天内回复
-
regression
难度 2/5 1-3 小时 新手友好度 70/100
-
sync-en
难度 1/5 1 小时以内 新手友好度 82/100
维护者通常 1 天内回复