我刚开始使用使用dotenv库的Laravel 5。这在项目的根目录中使用.env文件,该文件使用以下行设置环境:
APP_ENV=local
根据我在这个主题上阅读的所有内容,所有其他特定于环境的配置都应该放在这个文件中,所以数据库密码,网址等,然后读入主配置数组,如下所示:
env('DB_HOST', 'localhost')
虽然我觉得这可能适用于您可能不想提交的一些特定的数据库密码,但我真正想要的是能够为每个环境提交大部分或全部不同的环境值。
因此我想要的是.env将APP_ENV定义为“本地”,“暂存”或“生产”,然后有一个包含值的.local.env或.env.local文件,然后我可以提交将根据APP_ENV加载正确的文件。
这可能吗? Laravel 4有级联配置数组,看起来更灵活,但如果我有一个环境.env文件,那么我可以忍受。
答案 0 :(得分:7)
最后通过修改app / Providers / ConfigServiceProvider.php来解决它。创建项目时,此文件将作为存根添加到您的app文件夹,并用于覆盖配置值。
它现在处理级联配置,因此config / local / app.php中的任何值都将覆盖config / app.php。正如下面的评论所说,它不处理环境配置中的匹配数组,只会替换它。但我可以在需要时解决这个问题。
<?php namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Symfony\Component\Finder\Finder;
class ConfigServiceProvider extends ServiceProvider {
/**
* Overwrite any vendor / package configuration.
*
* This service provider is intended to provide a convenient location for you
* to overwrite any "vendor" or package configuration that you may want to
* modify before the application handles the incoming request / command.
*
* Modified 2014-01-20 to allow environment specific configs to be loaded
* from app/config/[environment]/ which will cascade over the base configs.
*
* @return void
*/
public function register()
{
$config = app('config');
$envPath = app()->configPath() . '/' . getenv('APP_ENV');
foreach (Finder::create()->files()->name('*.php')->in($envPath) as $file)
{
$configName = basename($file->getRealPath(), '.php');
$oldConfigValues = $config->get($configName);
$newConfigValues = require $file->getRealPath();
// Replace any matching values in the old config with the new ones.
// Doesn't yet handle matching arrays in the config, it will just replace them.
$config->set($configName, $newConfigValues + $oldConfigValues);
}
}
}
答案 1 :(得分:5)
你不得使用.env
来做所有事情。有几种选择。
选项1 - 仅使用.env
作为变量
'default' => env('DB_CONNECTION'),
选项2 - 仅对变量使用.env
,但如果不存在则具有系统默认值
'default' => env('DB_CONNECTION', 'mysql'),
选项3 - 只需对您的变量进行硬编码,而不是通过.env
'default' => 'mysql',
选项2可能是大多数配置选项的最佳选择。您仍然可以为您的git仓库定义(并提交)配置选项 - 但如果您愿意,可以在以后的任何.env
文件中轻松覆盖它。
选项1最适用于密码,应用密钥等 - 因此它们永远不会被提交到您的git仓库。
选项3适用于一些您知道永远不会改变的配置变量。
注意 - 层叠的Laravel 4配置文件夹选项不再可用。
答案 2 :(得分:3)
配置Laravel 5环境很容易。
对于完整的解释&#39;,我写了这个配置here。
我引用了dotenv开发者的说法;
phpdotenv是针对开发环境而制定的,通常应该 不能用于生产。在生产中,实际环境 应该设置变量,以便没有加载的开销 每个请求都有.env文件。这可以通过自动化实现 使用Vagrant,chef或Puppet等工具进行部署过程,或者可以 使用Pagodabox和Heroku等云主机手动设置。