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

Configuration 如何替换特定于环境的配置,而不是级联,configuration,laravel,laravel-4,Configuration,Laravel,Laravel 4,我想为我的database.php配置一个本地开发环境。我在我的应用程序中创建了一个新的配置控制器,并将database.php文件复制到其中。我使用的是MongoDB,在生产环境中,我使用的是多台服务器的副本集,但在本地,我只运行一台服务器,因此我的生产连接信息有更多选项: 制作: ... 'connections' => array( 'mongodb' => array( 'driver' => 'mongodb',

我想为我的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'
    )
),
问题是,当我的本地环境配置加载时,它会合并“连接”数组。我想要一种完全取代“mongodb”连接的方法,所以它要么是一个要么是另一个,而不是两者都是


如何完成此操作?

创建不同的配置文件集:

app/config/local/database.php
app/config/production/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',

);
然后你只需要使用它:

$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',
         ),

    ),

);

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

有一个警告。该应用程序托管在Amazon的云中,在自动扩展时,可以添加新实例(使用新主机名)。如果我有一个特定于生产的目录,而不是在默认情况下使用生产目录,那么我不需要指定要为其运行生产的每个主机名吗?它是否会将所有生产文件复制到新实例?是的,它是在新实例启动时从我们的Git repo中提取的,因此它与我们运行的任何其他服务器都是相同的,但是机器的主机名会不同,因此
detectEnvironment
中的数组将不包含新实例的主机名。那么我的编辑应该适合您。这就是我在应用程序中使用环境的方式。Laravel有一种类似的设置方法,但是,您仍然需要通过主机名或其他任何方式猜测环境名称,这会导致相同的问题,因此我认为我的方法更好,因为环境名称也来自点文件。我喜欢这样。目前,我发现,如果我为我不想在本地配置中设置的键定义“空”值,我可以完成我需要的,但我可能很快就会转向你的方式。尽管自动缩放,但我不会仍然遇到类似的问题吗?因为Git中不存在dotfile,当新实例启动时,将没有dotfile。我可以修改实例启动脚本来创建和插入dotfile,但这似乎有点不对劲。
$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';