场景
假如我们要使用七牛的 token。
- 直接写死在代码调用的地方。 [x]可维护性低
-
写在
config/app.php
文件中。[x]无法区分环境进行配置 -
存储在
.env
文件中,使用env()
方法直接读取。 [x]虽然解决了环境问题,但不推荐。 -
存储在
.env
和config/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/515/helper-functions