原文地址:http://culttt.com/2014/04/07/working-configuration-laravel-4/ 第一次翻译,难免粗糙,欢迎指正!

配置设置是在各种web应用中我们不得不处理的事。主流得web应用至少要配置数据库,但是通常要配置大量得第三方服务
我觉得如果你研究过不同得框架,你会发现不同web应用用各自不同的方法管理配置信息。我接触的开发者也经常用他们自己的方法管理配置。
在这周得教程中,我将介绍怎样在Laravel项目中处理配置信息。我以前得一些教程也介绍过如果使用配置,但我觉得这是个大家都需要的问题,所以值得再写篇文章。

配置文件

除非你刚接触Laravel,不然你一定已经知道Laravel默认的配置文件在哪。app/config文件夹下有不同单个的配置文件。

如果你打开其中一个文件,你会发现它仅仅是个简单的数组。这个简单的步骤使得我们创建自己的配置文件变得简单,因为这不难学。

由于配置文件都是分拆成单个的文件,组织你自己的配置文件也很简单。

你要注意到有个testing文件夹。你可以创建一个特定的环境文件以覆盖缺省配置。这个在你想在测试时使用内存数据库或者为本地环境配置一些特殊的配置

阅读一下配置文件看一下你自己的选项。你可能不想更改缺省配置,但是如果你想改它的话很有好处。

配置你的环境

当你第一次开发应用时很容易忽略配置环境。如果你跳过了这一步而直接编码,你可能不会仔细考虑配置两个不同的环境。

然而一旦你将要叫代码上传到生产服务器时,你需要正确为配置环境。

Laravel应用中得环境配置在boostrap/start.php。在这个文件中你叫看到下面的代码:

$env = $app->detectEnvironment(array(
 
  'local' => array('your-machine-name'),
 
));

默认情况下,Laravel应用运行在生产环境中。 你可以想下面这样定义其他环境:

$env = $app->detectEnvironment(array(
  'local' => array('philips-mbp.home'),
  'staging' => array('staging-server'),
  'production' => array('production-server')
));

philips-mbp.home表示计算机的hostname。运行hostname命令可得到该计算机的hostname

以前,你可以在Laravel中通过URL参数来设置环境。这不再是个方便得方法,但是你还能通过使用detectEnvironment 这个闭包函数来实现这一功能。

我个人更喜欢通过hostname来设置环境。

使用Config facade (至今不知道facade什么意思)

现在你已经正确配置了,你可以开始在代码中使用这些功能。这使得在配置文件中构建任何个性设置变得容易。而在配置文件中构建任何个性设置可以使配置设置不污染你的代码。

举个例子 假设你已经设置了一个缓存过期时间,你可以像下面那样获取配置:
$minutes = Config::get('cache.expiry'); 在上面得例子中,cache使文件名,expiry是键名。现在你可以简单使.隔开来选择这个数组中的一个值

你可以在get传个参数来设置时间: $minutes = Config::get('cache.expiry', 10);

你可以使用set方法,但这只在这次请求中有效: Config::set('cache.expiry', 10);

在service providers中使用配置

我觉得在service providers中是需要使用配置最普遍的场景之一。service providers使一种引导代码和准备服务的方法。

例如,我想列出缓存的生成时间,我可以这样写repository:

/**
 * Register User Repository
 */
public function registerUserRepository()
{
  $this->app->bind('Cribbb\Repositories\User\UserRepository', function($app)
  {
    $user = new EloquentUserRepository( new User, $app['hash'] );
 
    $minutes = $app['config']->get('cache.expires');
 
    return new CacheDecorator( $user, new LaravelCache( $app['cache'], 'user', $minutes) );
  });
}

在你的 service providers中你可以通过$this->app使用config实例。这跟使用facade是一样的,你可以使用相同的方法来获取和设置配置。

使用.文件

Laravel默认的配置文件结构是解决多配置问题的一种很赞的方法。这也使得配置自己的设置并且使用它们变得简单。

然而当涉及到敏感的设置(比如数据库密码)时,使用这种方法使不明智的。

例如,你可能不想在git中提交你的数据库信息,你只想在生产环境中使用特定的敏感信息。

当和很多伙伴同时开发时,这是个很头疼的事情,每个人都有自己的本地数据库,使用不同的用户名和密码。不用git管理本地配置文件也不一定是一种有效的方法。

哈哈,Laravel提供了一种优雅的解决方法———使用.文件

一个.文件在羡慕文件夹的根目录,包含任何敏感的或者环境相关的配置详情,这些都不应该提交到项目中。

你可以为每个环境创建一个.文件,配置信息包含在里面

例如,在本地工程目录下创建一个.env.local.php的文件。你还要在.gitignore中忽略它以免提交上去。

.env.local.php 中创建一个包含本地敏感配置信息的数组:

<?php
return array(
  'DATABASE_NAME' => 'my_database',
  'DATABASE_USER' => 'username',
  'DATABASE_PASSWORD' => 'totally_secure_password'
);

现在,在database.php配置文件中你可以用环境变量来替换写死的信息。

'database'  => $_ENV['DATABASE_NAME'],
'username'  => $_ENV['DATABASE_USER'],
'password'  => $_ENV['DATABASE_PASSWORD']

在每一个不同的环境(或者一个新伙伴准备在本地搭环境),你都可以创建一个.文件来保存本地的配置信息。这个可以保证本地敏感信息得安全,再也不用为版本控制担心。

结论

配置管理看上去有很多不同的途径。在生产环境中配置错了数据库或者第三方服务得api key都是我们不愿意看到的。所以要尽早搞定配置。

Laravel使配置环境易如反掌。我热衷于使用hostname配置环境。当环境不是很明确时,处理不同的环境是很棘手的。

你最终需要的配置信息多得吃惊。几乎所有的网络应用需要个数据库,大多数还需要很多第三方服务去完成的任务如发邮件,解决bug.在版本控制系统外备份所有的敏感配置信息,然后存储在服务器上,并且依赖他们。这是解决非常不需要的问题的优秀方法。(看不懂)原句是:

Keeping a copy of all of these sensitive configuration details outside of your version control and stored locally on the server that requires them is an excellent solution to a very unnecessary problem.