我正在尝试使用Codeigniter4构建一个多租户saas应用程序。我想为每个tanent的数据设置单个数据库,为用户设置一个全局数据库。我希望应用程序根据登录用户的tanent id自动切换到tanent的数据库。为此,我在app/config/constants.php中标识了tanents子域如下所示
if(!defined('myHostName')){
$sd=explode(".",$_SERVER['HTTP_HOST']);
//define('myHostName', $host);
if($sd[0]=='localhost')
define('dbname', 'defaultdb');
else
define('dbname', $sd[0]);这些代码标识子域,如果调用来自子域,则将dbname定义为子域的名称。然后我在app/config/database.php中定义了两个数据库组,如下所示。
public $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'db_blog',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
public $data = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => myHostName,
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];这很好,但是现在我希望基于域上的文件夹动态地选择数据库,例如对于租户1,基url将是https://example.com/tenant1租户2,基url将是https://example.com/tenant2承租者3,基url将是https://example.com/tenant3
这里的问题是,第一段(在本例中是tenant1/tenant2/tenant3)由codeigniter4标识为控制器,我假设必须有某种方法来识别站点url上的文件夹名,或者解决方案可能类似于https://www.sandeeprajoria.in/2013/05/multi-tenancy-with-codeigniter.html。
发布于 2022-04-28 02:44:46
“https://stackoverflow.com/questions/65790279/how-to-set-dynamic-baseurl-on-app-config-app-php-using-codeigniter-4”教我如何回答我的问题。$baseURL是以所有urls为前缀的常量,如果我动态地更改它,我可以在Constants.php文件中访问这个变量。由于我不能在database.php中创建或修改变量,所以我在constants.php中创建了一个常量,并将数据库的名称动态地分配给了该常量,以供特定的租户使用。Constants.php中定义的常量在database.php中是可用的,因此我可以动态地为特定租户配置数据库。实现类似解决方案的任何更好的想法都是最受欢迎的。
https://stackoverflow.com/questions/71962987
复制相似问题