在Laravel 5中设置ENV变量的正确方法是什么?

Ale*_*Kim 29 php laravel laravel-5 laravel-environment

在laravel 4中我们有:

$env = $app->detectEnvironment(array(
    'local' => array('homestead')
));
Run Code Online (Sandbox Code Playgroud)

默认情况下.

但在laravel 5中,它改为:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});
Run Code Online (Sandbox Code Playgroud)

此外,他们在.gitignore中排除了.env.*行,现在它已经:

.env
Run Code Online (Sandbox Code Playgroud)

并添加了文件.env.example:

APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=homestead
DB_PASSWORD=homestead
Run Code Online (Sandbox Code Playgroud)

所以,如果我有超过2个环境,我现在必须在一个.env文件中设置所有这些吗?例如:

APP_ENV=local
DB_PASSWORD=123

APP_ENV=alpha
DB_PASSWORD=456
Run Code Online (Sandbox Code Playgroud)

如果我没有.env文件,laravel将如何知道我正在使用的环境?

Mar*_*łek 30

你可以像在Laravel 4中那样完全相同:

$env = $app->detectEnvironment(array(
    'local' => array('homestead')
));
Run Code Online (Sandbox Code Playgroud)

*.envfile仅用于放置不应放入VCS的敏感数据.Laravel 4也是如此

但似乎在最后几天默认的detectEnvironment被更改为:

$env = $app->detectEnvironment(function()
{
    return getenv('APP_ENV') ?: 'production';
});
Run Code Online (Sandbox Code Playgroud)

所以你可以使用PC名称或ENV文件中的设置变量.

如果在主env文件中使用基于ENV的环境检测(默认情况下,.env您需要添加:

APP_ENV=local
Run Code Online (Sandbox Code Playgroud)

当然local这里是本地环境,你可以把它改成productiondev

目前我看到的最重要的问题是你需要记住在进行生产时将这个.env文件内容更改为APP_ENV=local,APP_ENV=production所以在我看来更好的方法是基于PC名称的旧默认方法.

现在ENV文件.如果使用基于ENV的环境检测,则应仅将其放入ENV文件中:

APP_ENV=local
Run Code Online (Sandbox Code Playgroud)

现在,您可以为不同的环境创建单独的ENV文件,例如:

.local.env:

 MY_DB=testdb
Run Code Online (Sandbox Code Playgroud)

.production.env:

MY_DB=productiondb
Run Code Online (Sandbox Code Playgroud)

现在在bootstrap.environment.php文件中你可以修改:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');
}
Run Code Online (Sandbox Code Playgroud)

成:

if (file_exists(__DIR__.'/../.env'))
{
    Dotenv::load(__DIR__.'/../');

    if (getenv('APP_ENV') && file_exists(__DIR__.'/../.' .getenv('APP_ENV') .'.env')) {
        Dotenv::load(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env');
    }   
}
Run Code Online (Sandbox Code Playgroud)

APP_ENV从主env文件加载额外的env文件.

现在,您可以像往常一样在其他配置文件中使用它: $_ENV['MY_DB']


Hir*_*ter 12

对于那些刚刚升级到5.2的人:

您不能再使用静态Dotenv::load()方法.请改用以下内容:

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../', '.' . getenv('APP_ENV') . '.env'); // Laravel 5.2
$dotenv->load();
Run Code Online (Sandbox Code Playgroud)

bootstrap/app.php.

//编辑Soo ..在深入挖掘过去一小时之后我不妨在这里添加一些额外的信息:

  • Laravel使用.env文件进行配置
  • 默认情况下,加载应用程序根目录中的文件".env"
  • 您可以通过env()帮助函数或直接通过PHP的本机getenv()函数访问这些.env文件中的值.虽然您应该只填写配置文件(请参阅参考资料/config/*.php),因为这些文件可以缓存.
  • .env文件加载到DetectEnvironment类中.我发现在调试设置断点时这很有帮助.请注意该行(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();:由于它使用了已设置的任何环境值,因此不会被覆盖!(你必须使用这样做 - 这让我疯了,因为宅基地将变量设置为php-fpm配置而你无法通过.env文件更改它)load() overload()APP_ENVlocal/etc/php/7.0/fpm/php-fpm.conf
  • 在编写单元测试时,通常会继承TestCase,将APP_ENV变量设置为测试(通过refreshApplication()- 使用putenv()覆盖默认local值)