我们希望默认连接太多数据库之一。根据用户要求,我们希望在变量或全局变量中取数据库名称。
我们无法在 Database.php 文件中使用任何变量
所以大家帮我解决这个问题。
我们希望默认连接太多数据库之一。根据用户要求,我们希望在变量或全局变量中取数据库名称。
我们无法在 Database.php 文件中使用任何变量
所以大家帮我解决这个问题。
自从我尝试做“奇怪”的事情以来已经有一段时间了,比如尝试在配置文件中分配动态变量,所以我不完全确定 CodeIgniter 是否支持它。但是,即使是这样,我还是建议使用为这些事情设计的功能:
https://codeigniter4.github.io/userguide/database/connecting.html#connecting-with-custom-settings
$custom = [
'DSN' => '',
'hostname' => 'localhost',
'username' => '',
'password' => '',
'database' => '',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'cacheOn' => false,
'cacheDir' => '',
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
$db = \Config\Database::connect($custom);
我想,因为除了数据库名称外,其他所有内容都相同,因此您还可以访问默认数据库的数据库配置属性并用于$custom = array_replace($configDb, ['database' => $_SESSION['db_name'])
更改数据库名称。显然检查它db_name
存在并且不是空的以及所有那些爵士乐。您甚至可以将整个逻辑db_name
作为构造函数放入一个类中,这样您就不必一直这样做。
例如(未经测试):
namespace App\Config;
use InvalidArgumentException;
class DatabaseChooser extends \Config\Database
{
protected $dbName;
public function __construct(string $dbName = '')
{
$this->dbName = $dbName;
$config = $this->buildArr();
return parent::connect($config);
}
private function buildArr()
{
if (empty($this->dbName)) {
throw InvalidArgumentException('dbName cannot be empty');
}
$default = $this->defaultGroup;
if (property_exists($this, $default) && is_array($this->$default)) {
return array_replace($this->$default, ['database' => $this->dbName]);
} else {
throw new Exception('Invalid configuration.');
}
}
}
我敢肯定你已经考虑过了,但 CI4 还没有完全准备好生产 afaik。老实说,我会使用 Laravel、Lumen 或 Symfony 之类的东西,它们已经拥有广泛且经过测试的代码库,以及许多兼容的第三方包。