你这个需求应该是属于多租户的范畴,可以看看 https://github.com/tenancy/tenancy,不止数据库,其余的stirage,cache都是根据租户相互独立的
使用中间件,先定义好每个域名对应的库,根据中间件多传一个参数给方法
或在Model直接做库的隔离,$connection = '库1';
就不用使用中间件了,但你使用的如果是DB查询和增删改可以用上面中间件的方式加参数。
你这个需求应该是属于多租户的范畴,可以看看 https://github.com/tenancy/tenancy,不止数据库,其余的stirage,cache都是根据租户相互独立的
分享下笔者手上维护的 Laravel 项目,不同域名访问不同数据库的做法:
一句话总结就是: 一个域名对应一个 .env
配置文件。
访问 a.domain.com ,使用配置文件
.env.a.domain.com
,当浏览 b.domain.com ,会切换到配置文件.env.b.domain.com
,配置文件跟单域名一样,更改对应的 DB_HOST、DB_DATABASE 就好 。
更改代码 bootstrap/app.php
<?php
...
// ------多域名,新增加开始
if(isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST'])){
$domain = $_SERVER['HTTP_HOST'];
if ($domain) {
$loader = new Dotenv\Loader('');
$app_env = '.env.'.$domain;
if(!file_exists(base_path()."/".$app_env)){
$data = ["status"=>"error", "code"=>500, "message"=>"config file not exists"];
header('Content-Type: application/json;charset=utf-8');
header('HTTP/1.1 500 Internal Server Error');
echo json_encode($data);exit;
}
$app->loadEnvironmentFrom($app_env);
}
} else {
$app_env = $app->detectEnvironment(function () {
return 'production';
});
}
// ------多域名,新增加结束
return $app;
另外,启动调度器加环境变量--env
由
* * * * * sudo -u apache php /path/artisan schedule:run >> /dev/null 2>&1
改为
* * * * * sudo -u apache php /path/artisan --env=a.domain.com schedule:run >> /dev/null 2>&1
* * * * * sudo -u apache php /path/artisan --env=b.domain.com schedule:run >> /dev/null 2>&1
...其它域名
目前,无论域名访问,还是控制台 Artisan 调用,跟单域名一样,可无差异的开发,程序能识别不同的数据库。
唯一一个问题:比如耗时功能,我把数据和域名信息放到 redis ,然后异步拿出来统一处理,这时想人为的切换到某个数据库连接,比如 .env.b.domain.com
, Model 就不知道怎么切换了(当然可以直接手写sql去切换)
2020.05.11更新—————————————
参考下面两个连接,已经解决前面提到Model随时切换数据库的疑问了
博客:深入理解 Laravel 中的数据库连接
fideloper.com/laravel-multiple-dat...
推荐文章: