Write the Code. Change the World.

12月 28

场景

假如我们要使用七牛的 token

  1. 直接写死在代码调用的地方。 [x]可维护性低

  2. 写在 config/app.php 文件中。[x]无法区分环境进行配置

  3. 存储在 .env 文件中,使用 env() 方法直接读取。 [x]虽然解决了环境问题,但不推荐。

  4. 存储在 .envconfig/app.php 文件中,然后使用 config()函数来读取。 [x] 最佳方案

一种方法是最古老的方法,代码可维护性极低,一旦域名变更就只能全局替换。第二种方法无法区分环境,例如本地使用开发环境域名测试,线上才是正式的 CDN 域名。第三种方法虽然解决了环境变量的问题,并且也具备一定的灵活性,但是不够灵活,假如你的网站流量巨大,需要配置几个 CDN 域名,使其在加载静态资源时随机支配域名,这种做法就无法满足需求了。第四种方法既支持环境变量,又具备极高的灵活性,假如遇到同样的 CDN 多域名随机问题,你只需要写一个辅助方法,然后在 config/app.php 中调用即可,不需要动到任何一行业务逻辑代码。

通常 config/app.php 中已经配置了环境需要的一些信息。为了保持这里的干净,可以在config目录下新建一个配置文件。比如我要做一个 rhbody.com 的网站,就可以在这里建一个config/rhbody.php 的配置文件。又或者第三方登录,也可以专门建立一个 auth 的配置。甚至第三方扩展,通过 composer 安装后,其配置文件也会放在 config 目录下。

代码示例

.env 文件中设置:

# qiniu.com for backup database
QINIU_ACCESS_KEY=xxx
QINIU_SECRET_KEY=xxxx
QINIU_BACKUP_BUCKET=qiniu_backup
# 我用自己的域名映射过去
QINIU_BACKUP_DOMAIN=https://qiniu.qiubg.com

config/rhbody.app 文件中设置

<?php 
return [
    'qiniu' => [
        'driver'     => 'qiniu',
        'access_key' => env('QINIU_ACCESS_KEY'),
        'secret_key' => env('QINIU_SECRET_KEY'),
        'bucket'     => env('QINIU_BACKUP_BUCKET'),
        'domain'     => env('QINIU_BACKUP_DOMAIN'),
    ],
];

在程序中,可以通过下边方式来获取配置。

config('rhbody.qiniu');

如果,是在 config/app.php 中定义的,还能通过 env()方法获取。于是,有这样一个规定:

在此统一规定:所有程序配置信息 必须 通过 config() 来读取,所有的 .env 配置信息 必须 通过 config() 来读取,绝不 在配置文件以外的范围使用 env()

当然,只针对上边这些配置,放在 config/filesystems.php 中更合理。

扯远一点,在程序中,我们可以定义一个辅助类,全局调用函数就可以帮我们拿到配置。为什么呢,因为获取配置有可能是多元化的。比如我想取得七牛服务器的地址,当配置中的配置不存在,或有其他地址时,就可以适应了。

<?php

function get_qiuniu_domain()
{
    return config('rhbody.qiuniu.domain')?:'https://qiuniu.com/';
}

辅助函数的使用

bootstrap 目录,孤零零的存在根目录下。我们可以将辅助函数建立在这里。比如:'bootstrap/helpers.php'。

然后在 bootstrap/app.php 文件顶部引入辅助函数文件。

<?php

require __DIR__ . '/helpers.php';

...

假如在 'bootstrap/helpers.php' 中定义了上边所说的函数,就可以在程序中调用该函数。

<?php 

$qiuniu_domain = get_qiuniu_domain();

参考

https://fsdhub.com/books/laravel-specification/514/configuration-information-and-environment-variables

https://fsdhub.com/books/laravel-specification/515/helper-functions

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注