0

我们希望默认连接太多数据库之一。根据用户要求,我们希望在变量或全局变量中取数据库名称。

我们无法在 Database.php 文件中使用任何变量

所以大家帮我解决这个问题。

在此处查看代码 Codeigniter 4.0.0

4

1 回答 1

0

自从我尝试做“奇怪”的事情以来已经有一段时间了,比如尝试在配置文件中分配动态变量,所以我不完全确定 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 之类的东西,它们已经拥有广泛且经过测试的代码库,以及许多兼容的第三方包。

于 2019-09-09T08:27:42.560 回答