如何替换特定于环境的配置,而不是级联

时间:2014-03-27 15:02:13

标签: configuration laravel laravel-4

我想为我的database.php配置本地开发环境。我在我的应用程序中创建了一个新的配置控制器,并将database.php文件复制到其中。我正在使用MongoDB并在生产中,我使用的是具有多个服务器的副本集,但在本地,我只是运行单个服务器,因此我的生产连接信息有更多选项:

生产:

    ...
'connections' => array(

    'mongodb' => array(
        'driver'   => 'mongodb',
        'host'     => array('mongoDBA', 'mongoDBB'),
        'port'     => 27017,
        'username' => 'myUserName',
        'password' => 'myPassword',
        'database' => 'theDatabase',
        'options'  => array('replicaSet' => 'myReplicaSet')
    )
),

本地:

    ...
'connections' => array(

    'mongodb' => array(
        'driver'   => 'mongodb',
        'host'     => 'localhost',
        'port'     => 27017,
        'database' => 'theDatabase'
    )
),

问题是,当我的本地环境配置加载时,它会合并“connections”数组。我想要一种方法来完全取代“mongodb”连接,所以它是一个或另一个,而不是两者。

我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

创建不同的配置文件集:

app/config/local/database.php
app/config/production/database.php

删除文件(或您不想要的文件):

app/config/database.php

您必须将环境设置为

local
development

修改

这就是我如何完美地设置我的环境,因此我不必处理主机名,仍然不会让我的本地环境与分段和生产冲突。

在应用程序的根目录中创建一个.environment文件,并定义您的环境并将敏感信息添加到其中:

<?php

return array(

     'APPLICATION_ENV' => 'development', /// this is where you will set your environment

     'DB_HOST' => 'localhost',
     'DB_DATABASE_NAME' => 'laraveldatabase',
     'DB_DATABASE_USER' => 'laraveluser',
     'DB_DATABASE_PASSWORD' => '!Bassw0rT',

);

将其添加到您的.gitignore文件中,这样您就不会有将密码发送到Github或任何其他服务器的风险。

$app->detectEnvironment之前,在文件bootstrap/start.php中,将您的.environment文件加载到PHP环境中:

foreach(require __DIR__.'/../.environment' as $key => $value) 
{
    putenv(sprintf('%s=%s', $key, $value));
}

然后你必须使用它:

$env = $app->detectEnvironment(function () {

    return getenv('APPLICATION_ENV'); // your environment name is in that file!

});

它可以在任何地方使用,因此您不再需要单独的目录进行开发和生产:

<?php

return array(

    'connections' => array(

         'postgresql' => array(
              'driver'   => 'pgsql',
              'host'     => getenv('DB_HOST'),
              'database' => getenv('DB_DATABASE_NAME'),
              'username' => getenv('DB_DATABASE_USER'),
              'password' => getenv('DB_DATABASE_PASSWORD'),
              'charset'  => 'utf8',
              'prefix'   => '',
              'schema'   => 'public',
         ),

    ),

);

请注意,我没有设置后备:

return getenv('APPLICATION_ENV') ?: 'local';

因为,如果我没有在我部署应用程序的每台服务器上设置文件我希望它失败