Laravel-自定义.env文件


Laravel - custom .env file

Laravel假设.env文件应该描述环境,并且不应该将其提交给您的repo。

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

类似的东西

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

我怎样才能做到这一点?谢谢

Nadeem0035让我很清楚如何进行

return $app; 前的bootstrap'app.php

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

对自定义.env文件使用Dotenv::load((

laravel 5.1与vlucas/phpdotenv~1.0

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

laravel 5.2与vlucas/phpdotenv~2.0

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

PHP dotenv

在bootstrap/app.php 中

我喜欢为那些为许多vhosts添加共享代码库的人添加一个解决方案,这些vhosts都需要不同的.env文件来完成所有不同的事情,如数据库连接、smtp设置等

对于每个vhost,在Apache上创建一个vhost-config:

<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>

所有vhosts都有相同的文档根和目录,因为它是一个共享的代码库。在配置中,我们添加了一个SetEnv VHOST_NAME 'your-vhost',稍后我们将在Laravel的bootstrap.php中使用它来更改vhost-specific .env的位置。

接下来,在文件夹(fe./var/www/your vhost/.env(中创建自定义.env file,即alter bootstrap.php,以便从正确的位置加载.env。

<?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;

仅此而已。

[edit]如果您希望以特定数据库为目标,或希望为特定.env生成密钥,则应将VHOST_NAME放在artisan命令前面。

VHOST_NAME=tenant2.domain.com php artisan key:generate

[edit]当在本地工作并使用Laravel Valet时,您可以在代码库的根目录中添加一个自定义.valet-env.php。https://laravel.com/docs/master/valet#site-特定环境变量

您在laravel中有一个.env文件,您可以定义应用程序的级别。 APP_ENV=local APP_ENV=production 您可以根据需要设置配置,而无需在此处创建新的.env文件。关于Laravel环境变量的更多信息:这里有更多的描述性帮助:phpdotenv

我在开发过程中也有类似的需求,我想在我的开发箱上做一些特别的"多租户",以针对多个数据库/配置测试相同的代码库。我不想要带有一堆if/then语句的意大利面条式代码,所以我提出了以下解决方案,它非常适合我的目的(不需要处理Apache、nginx或Caddy文件(:

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

// 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",则该文件将位于名为.env.example.local.com的子目录内(。

您可以更改代码,从目录名中删除有点多余的.env.前缀,但我喜欢添加它,以使目录列表中的所有.env.*条目保持在一起。

这种方法的一个好处是:通过在子目录中使用常用名称('.env'(,您应该只需要一个.env条目,就可以确保所有自定义配置都不在git repo中。无需为每个自定义点环境文件添加新的.gitignore条目

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

  • 具有主配置和共享配置的CCD_ 28文件
  • .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中工作。