Laravel 多租户如何根据不同域名访问不同数据库

1、要实现saas效果,一套程序对应多个数据库
2、域名是泛解析(需要认证过的域名才能使用,没有认证的都拦截)

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
ALMAS
最佳答案
4年前 评论
91it (楼主) 4年前
91it (楼主) 4年前
ALMAS (作者) 4年前
讨论数量: 5

使用中间件,先定义好每个域名对应的库,根据中间件多传一个参数给方法 或在Model直接做库的隔离,$connection = '库1'; 就不用使用中间件了,但你使用的如果是DB查询和增删改可以用上面中间件的方式加参数。

4年前 评论
Cooper

Provider boot 方法 中 DB::setDefaultConnection

4年前 评论

可以参考下我的 创建一个全局中间件

把注释取消就好了

(如果有支付的话 注意支付会不会切换数据库)
file

file

file

4年前 评论
91it (楼主) 4年前
ALMAS
4年前 评论
91it (楼主) 4年前
91it (楼主) 4年前
ALMAS (作者) 4年前

分享下笔者手上维护的 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去切换) :joy:

2020.05.11更新—————————————
参考下面两个连接,已经解决前面提到Model随时切换数据库的疑问了
博客:深入理解 Laravel 中的数据库连接
fideloper.com/laravel-multiple-dat...

4年前 评论
91it (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!