环境目录中的 database.php 文件未在 Laravel 4 中加载
Posted
技术标签:
【中文标题】环境目录中的 database.php 文件未在 Laravel 4 中加载【英文标题】:database.php file from environment directory not being loaded in Laravel 4 【发布时间】:2014-08-04 23:03:30 【问题描述】:我正在尝试加载位于我的 app/config/local 目录中的 database.php 文件的本地版本。 我已经在 start.php 中为本地设置了我的 $env 环境检测。
$env = $app->detectEnvironment(array(
'local' => array('your-machine-name')
));
正确的环境似乎被正确检测为使用的结果:
App::environment('local')
评估为 TRUE,但它只加载 app/config 目录中的默认 database.php。
以防它仍然与检测有关,我尝试将本地硬编码为环境,但效果相同。
$env = $app->detectEnvironment(function()
return 'local';
);
我还尝试为环境使用不同的名称,以防“本地”有一些未记录的保留含义。
我已经使用 Laravel 4 在其他项目中成功设置了环境,但我终其一生都无法弄清楚这种情况有什么不同。对于可能导致这种行为的任何建议,我将不胜感激。
本地环境在 MAMP 上运行。
我刚刚做了一个额外的测试,发现我本地文件夹中的 app.php 文件加载正确。只有本地的 database.php 文件似乎没有加载。
【问题讨论】:
我刚刚注意到还有另一个未解决的问题似乎提到了同样的问题:link 【参考方案1】:生产配置文件首先加载,然后与其他环境的覆盖合并。如果生产文件生成错误(例如未定义的索引),配置加载将提前退出而不加载覆盖。检查它是否在日志中生成错误。如果是这样,在生产配置文件中,在尝试使用它之前检查该值是否已设置,然后本地配置文件将正确加载。
【讨论】:
谢谢!这很方便知道。我的生产配置文件包含对仅在生产服务器上可用的全局服务器变量的引用(AWS Elastic Beanstalk 上的 RDS 数据库变量)。由于这些在本地和测试服务器中不可用,因此它们抛出错误,然后没有加载具有正确详细信息的数据库配置文件。感谢您的回答,我有一个我一直在使用的解决方法,但现在我终于可以解决这个问题了。【参考方案2】:在app/config
目录内的项目中,您应该创建一个名为local
的目录,然后在该目录中创建一个名为database.php
的文件,并在该文件中提供配置,例如:
// File: app/config/local/database.php
return array(
'connections' => array(
'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'myTestDb', // myTestDb is a db name for example
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
'pgsql' => array(
'driver' => 'pgsql',
//...
),
),
);
然后在您的 project_folder/bootstrap/start.php
文件中使用如下内容:
$env = $app->detectEnvironment(array(
'local' => array('*.dev', gethostname()),
'production' => array('*.com', '*.net')
));
您也可以查看this answer 进行环境设置。这应该可以。
【讨论】:
我同意这应该可行,但是如果您重新阅读我的问题,您会发现 start.php 中的环境检测似乎工作正常,并且我已经在我的配置中设置了本地 database.php /本地文件夹。问题是尽管环境被检测为本地,但本地版本的 database.php 没有被加载。 是什么让您认为,您的database.php
的本地版本没有被加载?
因为它尝试使用 config 目录中的 database.php 文件中的凭据而不是 config/local 目录中的凭据连接到数据库。目前我的解决方法是在 config 目录中的 database.php 中使用 if (App::environment('local')) return array( /* database details */ );
语句,但我真的想隔离实际问题并修复它 - 感谢您到目前为止提供的帮助。
现在我遇到了同样的问题。在检查环境时,它是local
,它从本地文件夹加载其他配置文件,然而,当涉及到数据库时,它不会从本地文件夹加载配置,而是直接从生产环境加载......令人惊讶,它只发生在数据库配置中。其余配置工作正常。以上是关于环境目录中的 database.php 文件未在 Laravel 4 中加载的主要内容,如果未能解决你的问题,请参考以下文章
.env 文件中的 MySQL 密码不起作用,但在 database.php 中工作正常(env() 缓存旧密码,config:clear 不会删除它)