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

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

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
ALMAS
最佳答案
3年前 评论
91it (楼主) 3年前
91it (楼主) 3年前
ALMAS (作者) 3年前
讨论数量: 5

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

3年前 评论
Cooper

Provider boot 方法 中 DB::setDefaultConnection

3年前 评论

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

把注释取消就好了

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

file

file

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

分享下笔者手上维护的 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...

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

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