Laravel - 自定义.env文件

时间:2016-08-08 07:08:17

标签: php laravel

Laravel假定.env文件应描述环境,不应将其提交给您的回购。

如果我想在我的仓库中保留.envdev(例如production.env-production)的.env-dev个文件,并添加一些自定义逻辑,该怎么办?应该使用哪个文件,例如基于当前域名。

这样的东西
if ($_SERVER['HTTP_HOST'] == 'prod.domain.com') {
    load('.env-production');
} else {
    load('.env-dev');
}

我怎样才能实现它? 谢谢!

6 个答案:

答案 0 :(得分:6)

将Dotenv :: load()用于自定义.env文件

laravel 5.1 with vlucas / phpdotenv~1.0

if ($_SERVER['HTTP_HOST'] == 'prod.domain.com') {
    Dotenv::load(__DIR__ . '/../','.production.env');
} else {
    Dotenv::load(__DIR__ . '/../','.dev.env');
}

OR

laravel 5.2 with vlucas / phpdotenv~2.0

$dotenv = new Dotenv\Dotenv(__DIR__, 'myconfig'); // Laravel 5.2
$dotenv->load();

PHP dotenv

在bootstrap / app.php中

答案 1 :(得分:5)

Nadeem0035 让我非常清楚该怎么做

bootstrap\app.php

之前

return $app;

$envFile = $_SERVER['HTTP_HOST'] == 'prod.domain.com' ? '.env-production' : '.env-dev';
$app->loadEnvironmentFrom($envFile);

答案 2 :(得分:1)

您已将.env文件单独放入laravel,您可以定义应用级别。 APP_ENV=local 要么 APP_ENV=production 您可以根据需要设置配置,而不需要在此处创建新的.env文件。有关Laravel Environment Variables的更多信息: 以下是对您的更具描述性的帮助:phpdotenv

答案 3 :(得分:0)

我想为拥有许多虚拟主机共享代码库的人添加解决方案,这些人都需要使用不同的.env文件来处理所有不同的事物,例如数据库连接,smtp设置等

对于Apache上的每个 vhost ,创建一个vhost配置:

<VirtualHost *:80>
    ServerName your-vhost.yourdomain.com
    DocumentRoot /var/www/shared-codebase/public

    SetEnv VHOST_NAME 'your-vhost'

    <Directory "/var/www/shared-codebase/public">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride all
    Order deny,allow
    Require all granted
    </Directory>

    <IfModule mpm_itk_module>
       AssignUserId your-vhost your-vhost
    </IfModule>

    ErrorLog /var/www/your-vhost/logs/error.log
    CustomLog /var/www/your-vhost/logs/access.log combined
</VirtualHost>

所有虚拟主机具有相同的文档根目录和目录,因为它是共享的代码库。在配置内部,我们添加了SetEnv VHOST_NAME 'your-vhost',稍后将在Laravel的bootstrap.php中使用它来更改特定于虚拟主机的.env的位置。

接下来,在文件夹{fe。/var/www/your-vhost/.env)的另一个.env file中创建自定义bootstrap.php,以便从正确的位置加载.env。 / p>

<?php

$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);

$app->singleton(
    Illuminate\Contracts\Http\Kernel::class,
    App\Http\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    App\Console\Kernel::class
);

$app->singleton(
    Illuminate\Contracts\Debug\ExceptionHandler::class,
    App\Exceptions\Handler::class
);

/*
|--------------------------------------------------------------------------
| Add the location of the custom env file
|--------------------------------------------------------------------------
*/    
$app->useEnvironmentPath('/var/www/'.$_SERVER['VHOST_NAME']);

return $app;

仅此而已。

答案 4 :(得分:0)

对于在不同机器/主机上工作的团队,我想分享我的两分钱。 我在应用程序的根目录上创建了一个目录env,其中包含:

  • 具有主要配置和共享配置的.master.env文件。
  • 一个.name文件,仅包含具有特定计算机/用途的环境名称的字符串(例如“ server1”)
  • 与上面定义的名称匹配的特定.env文件,例如.server1.env

然后,在bootstrap / app.php中:

/**
 * master config
 */
$app->useEnvironmentPath(__DIR__.'/../env');
$app->loadEnvironmentFrom('.master.env');

/**
 * config overloading
 */
$app->afterLoadingEnvironment(function() use($app) {
    $envFile = trim(file_get_contents($app->environmentPath().'/.name'));
    if ($envFile && file_exists($app->environmentPath().'/.' .$envFile .'.env')) {
        $dotenv = Dotenv\Dotenv::create($app->environmentPath(), '.'.$envFile.'.env');
        $dotenv->overload();
    }
});

现在,您可以有选择地覆盖特定计算机的配置密钥,如果不存在安全问题,可以将env文件放入VCS中,只要忽略“ .name”文件即可。

在Laravel 5.8中工作。

答案 5 :(得分:0)

我在开发过程中有类似的要求,并且想在我的开发箱中做一些临时的“多租户”来针对多个数据库/配置测试相同的代码库。我不想要带有一堆if / then语句的意大利面条代码,所以我想出了以下解决方案,该解决方案非常适合我的目的(并且不需要对Apache,nginx或Caddy文件进行任何处理):< / p>

bootstrap/app.php行之后的$app = new Illuminate\Foundation\Application(...);中添加以下内容:

// First, check to see if there is a file named '.env'
// within a subdirectory named '.env.{{HOST_NAME}}
//
if (is_file($app->environmentPath().DIRECTORY_SEPARATOR. '.env.' . $_SERVER['HTTP_HOST'] .DIRECTORY_SEPARATOR. '.env')) {

    // ...And if there is, use the directory as the new environment path
    $app->useEnvironmentPath($app->environmentPath().DIRECTORY_SEPARATOR. '.env.'. $_SERVER['HTTP_HOST']);
}ER['HTTP_HOST']);
}

// Otherwise,  just use the standard .env file as the default...

一旦包含此内容,该应用程序默认仍将使用.env(这意味着您仍然可以对不需要自定义的任何主机使用标准.env文件),但首先 它会检查以主机名命名的子目录中是否存在备用.env文件(即,如果主机名是“ example.local.com”,则该文件将位于名为{{ 1}})。

您可以更改代码以从目录名称中删除有些多余的.env.example.local.com前缀,但是我想添加它以将所有.env.条目保留在目录列表中。

这种方法的一个好处:通过使用子目录中的普通名称('.env') ,您只需输入一个.env.*就可以确保全部,您的自定义配置不会进入git存储库。无需为每个自定义的dot-env文件添加新的.env条目。