如何在单个 Laravel 应用程序中为多个域加载不同的 .env 文件?

Het*_*iya 5 php laravel

我想通过多个域访问单个 Laravel 应用程序。

对于路由,我使用了 Laravel 路由模式,例如。

$appRoutes = function() {
     Route::group(['namespace'=>"Interface1"], function(){

     /** route for index page and User authentication pages **/
     Route::get('/', 'LoginController@showLoginForm')->name('login'); 
 });
};

Route::group(array('domain' => 'example1.com'), $appRoutes);
Route::group(array('domain' => 'example2.com'), $appRoutes);
Run Code Online (Sandbox Code Playgroud)

现在,对于每个域,我已经替换了 AppServiceProvider.php 注册方法中的配置变量值:

   if(isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST']) ){ 
        if($_SERVER['HTTP_HOST']=='example1.com'){  
            $configArray = [
                'APP_NAME' => 'Application 1',
                'APP_URL'  =>  'http://example1.com', 
            ]; 
        }else{  
            $configArray = [
                'APP_NAME' => 'Application 2', 
                'APP_URL' =>  'http://example2.com, 
            ];  
        }  
        config($configArray);
    } 
Run Code Online (Sandbox Code Playgroud)

但我仍然没有使用正确的域名网址url(config('app.url'))

如何加载.env每个域的所有变量覆盖?

小智 7

对于当前的Laravel 7.x. 在撰写本文时,您可以在bootstrap/app.php文件中的语句之前添加以下代码return $app

// bootstrap/app.php

// ...

/*
|-----------------------------------------------
| Load domain-specific .env file if it exists
|-----------------------------------------------
*/

if(isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST'])){
    $domain = $_SERVER['HTTP_HOST'];
}

if (isset($domain)) {
    $dotenv = Dotenv\Dotenv::createImmutable(base_path(), '.env.'.$domain);

    try {
        $dotenv->load();
    } catch (\Dotenv\Exception\InvalidPathException $e) {
        // No custom .env file found for this domain
    }
}

// ...

return $app;
Run Code Online (Sandbox Code Playgroud)

接下来,您应该有一个.env以下格式的每个域的文件.env.example1.com .env.example2.com。对于缺少显式文件的域,您可以保留原始文件.env作为后备.env

对于 Laravel5.x或 Laravel ,您可以从原始解决方案6.x中找到更多内容。


apo*_*fos 5

config()设置配置设置,但不设置环境设置。

您必须执行以下操作:

if(isset($_SERVER['HTTP_HOST']) && !empty($_SERVER['HTTP_HOST']) ){ 
    if($_SERVER['HTTP_HOST']=='example1.com'){  
         $configArray = [
            'app.name' => 'Application 2', 
            'app.url' =>  'http://example2.com', 
        ];  ;
    }else{  
        $configArray = [
            'app.name' => 'Application 2', 
            'app.url' =>  'http://example2.com', 
        ];  
    }  
    config($configArray);
} 
Run Code Online (Sandbox Code Playgroud)

然后您可以通过以下方式检索值:

config("app.name");
config("app.url");
Run Code Online (Sandbox Code Playgroud)

据我所知,在实际加载配置之前无法修改环境变量,因为配置是在服务提供者注册之前加载并读取环境变量的。

还要注意使用HTTP_HOST,因为它是客户端设置的标头,可能不可靠。