参考
加载过程
- laravel的所有配置文件都在config目录下
- 启动时加载所有config目录下的所有配置文件
- 通过Dotenv 类库加载.env文件中的配置项到预定义全局变量$_ENV中
- env函数中使用getenv()来获取环境变量$_ENV中的值
- config文件中使用env()加载配置值
- config()函数调用config文件中的配置项
使用配置文件时要注意严格遵守约定,在config文件中调用env()函数
在路由,控制器和模型以及自定义类文件中必须使用config()函数获取配置项的值
Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables;
/**
* Bootstrap the given application.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @return void
*/
public function bootstrap(Application $app)
{
//此处判断是否开启缓存配置,开启缓存配置直接返回缓存中的配置
//因此开启缓存配置后,env()函数会失效
if ($app->configurationIsCached()) {
return;
}
$this->checkForSpecificEnvironmentFile($app);
//此处加载.env中的文件
try {
(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
} catch (InvalidPathException $e) {
//
}
}
/**
* Gets the value of an environment variable.
*
* @param string $key
* @param mixed $default
* @return mixed
*/
function env($key, $default = null)
{
$value = getenv($key);
if ($value === false) {
return value($default);
}
switch (strtolower($value)) {
case 'true':
case '(true)':
return true;
case 'false':
case '(false)':
return false;
case 'empty':
case '(empty)':
return '';
case 'null':
case '(null)':
return;
}
if (strlen($value) > 1 && Str::startsWith($value, '"') && Str::endsWith($value, '"')) {
return substr($value, 1, -1);
}
return $value;
}
/**
* Get / set the specified configuration value.
*
* If an array is passed as the key, we will assume you want to set an array of values.
*
* @param array|string $key
* @param mixed $default
* @return mixed|\Illuminate\Config\Repository
*/
function config($key = null, $default = null)
{
if (is_null($key)) {
return app('config');
}
if (is_array($key)) {
return app('config')->set($key);
}
return app('config')->get($key, $default);
}
//app('config) 生成的是 Illuminate\Config\Repository 实例
开启缓存配置
php artisan config:cache
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
//调用清楚缓存命令
$this->call('config:clear');
//加载所有配置项
$config = $this->getFreshConfiguration();
//使用var_export导出php可以执行的数组
//文件系统使用file_put_contents 生成 配文件 config.php
//配置文件缓存目录 app/bootstrap/cache/config.php
$this->files->put(
$this->laravel->getCachedConfigPath(),
'<?php return ' . var_export($config, true) . ';' . PHP_EOL
);
$this->info('Configuration cached successfully!');
}
php artisan config:clear
/**
* Execute the console command.
*
* @return void
*/
public function handle()
{
//laravel文件系统使用 unlink 删除 缓存的config.php文件
$this->files->delete($this->laravel->getCachedConfigPath());
$this->info('Configuration cache cleared!');
}
总结
处理思想就是把多个配置文件合并成一个配置文件,减少I/0操作提升性能.