【问题标题】:Laravel saas one app multiple databases - symlinks?Laravel saas 一个应用程序多个数据库 - 符号链接?
【发布时间】:2025-12-11 11:20:26
【问题描述】:

我正在尝试在 Laravel 5 中创建 saas 应用程序。

我需要的是一个包含主应用程序的目录。 /var/www/main/ - 没关系。

当我创建新客户端时,会创建新数据库,创建新子域,但我不知道如何创建指向主应用程序的符号链接 - 但使用自定义 .env 文件。

所以我有:/var/www/clients/clientA/ - 在此目录中,我需要此客户端的 .env 文件,但其他所有内容都是指向主应用程序的符号链接。

然后如果我打开 clientA.application.com - 这个 clientA .env 应该被加载并且 laravel 应该连接到选定的客户端 A 数据库。

我尝试了ln -s /var/www/main/ /var/www/clients/clienatA/ - 当然,当我编辑 .env 文件时,它也在主应用程序中进行了编辑。

有人可以帮忙吗?谢谢大家。

【问题讨论】:

    标签: php laravel symlink saas


    【解决方案1】:

    我认为你可以在 bootstrap/app.php 中做到这一点:

    switch (getenv('HTTP_HOST')) {
        case 'subdomain1.mywebsite.com':
            $environmentFile = '.subdomain1.env';
            break;
        case 'subdomain2.mywebsite.com':
            $environmentFile = '.subdomain2.env';
            break;
    
    }
    $environmentPath = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR;
    Dotenv::load($environmentPath , $environmentFile);
    

    您可以拆分 getenv('HTTP_HOST') 并提取子域,然后相应地设置 $environmentFile...

    .htaccess 的另一种解决方案:

    .htaccess:

    <If "%{HTTP_HOST} == 'sub.domain'">
        SetEnv APP_DOMAIN sub
    </If>
    

    并且 然后:

    //own env directory for separate env files
    $app->useEnvironmentPath( realpath(__DIR__ . '/../env/') );
    //separate files for each domain (see htaccess)
    $app->loadEnvironmentFrom( getenv('APP_DOMAIN') . '.env' );
    

    【讨论】:

      【解决方案2】:

      您正在寻找多租户设置。随意从https://github.com/hyn/multi-tenant 中汲取灵感;它可能比您需要的多一点,但它解决了租户特定配置超载的问题。

      根据主机名识别租户后,它将从租户目录中读取自定义配置并覆盖现有配置键。

      https://github.com/hyn/multi-tenant/blob/5.x/src/Listeners/Filesystem/LoadsConfigs.php

      【讨论】: