您的位置:首页 > 编程语言 > PHP开发

Laravel源码入门-启动引导过程(六)LoadEnvironmentVariables

2017-05-15 20:49 477 查看
在 《Laravel源码入门-启动引导过程(五)$kernel->handle($request)》中第一个要载入的是 LoadEnvironmentVariables,也就是 Foundation\Http\Kernel::bootstrapers[] 的第一个,\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables,如下:



// Illuminate\Foundation\Http\Kernel.php 片段

/**
* The bootstrap classes for the application.
* 引导类,起引导作用的类
*
* @var array
*/
protected $bootstrappers = [
// 载入服务器环境变量(.env 文件)
\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
// 载入配置信息(config 目录)
\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
// 配置如何处理异常
\Illuminate\Foundation\Bootstrap\HandleExceptions::class,
// 注册 Facades
\Illuminate\Foundation\Bootstrap\RegisterFacades::class,
// 注册 Providers
\Illuminate\Foundation\Bootstrap\RegisterProviders::class,
// 启动 Providers
\Illuminate\Foundation\Bootstrap\BootProviders::class,
];

我们再直接贴出 LoadEnvironmentVariables 类的代码,进行分析,非常直观,如下:

<?php // Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables.php 代码

namespace Illuminate\Foundation\Bootstrap;

// phpdotenv:一个程序包,文件夹中搜索可以找到,自动把 .env 文件的内容载入 $_ENV和$_SERVER
use Dotenv\Dotenv;
use Dotenv\Exception\InvalidPathException;
use Symfony\Component\Console\Input\ArgvInput;
use Illuminate\Contracts\Foundation\Application;

class LoadEnvironmentVariables
{
/**
* Bootstrap the given application.
* 引导指定$app,这里是注入依赖方式
*
* @param  \Illuminate\Contracts\Foundation\Application  $app
* @return void
*/
public function bootstrap(Application $app)
{
if ($app->configurationIsCached()) {
return;
}

$this->checkForSpecificEnvironmentFile($app);

try {
// 这里语句分两部分,new 一个 Dotenv 对象,该对象调用 load() 方法,
// 载入了根目录 .env 文件的配置。
(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
} catch (InvalidPathException $e) {
//
}
}

/**
* Detect if a custom environment file matching the APP_ENV exists.
*
* @param  \Illuminate\Contracts\Foundation\Application  $app
* @return void
*/
protected function checkForSpecificEnvironmentFile($app)
{
if (php_sapi_name() == 'cli' && with($input = new ArgvInput)->hasParameterOption('--env'))
{
$this->setEnvironmentFilePath(
$app, $app->environmentFile().'.'.$input->getParameterOption('--env')
);
}

if (! env('APP_ENV')) {
return;
}

$this->setEnvironmentFilePath(
$app, $app->environmentFile().'.'.env('APP_ENV')
);
}

/**
* Load a custom environment file.
*
* @param  \Illuminate\Contracts\Foundation\Application  $app
* @param  string  $file
* @return void
*/
protected function setEnvironmentFilePath($app, $file)
{
if (file_exists($app->environmentPath().'/'.$file)) {
$app->loadEnvironmentFrom($file);
}
}
}

完成后,我们就可以使用Laravel提供的帮助函数 env() 来获取环境变量的值,如 dump(env('APP_URL'))。

附1:这里有一个细微的问题,就是 .env 文件中有一个配置项 APP_ENV=local,因此,应该将 .env 文件改名为 .env.local 也可以读取到该文件。但如果在 APP_ENV=local 的情况下,把 名字改为其他的,如 .env.localxx,就会出错,报 catch (InvalidPathException $e) 错误,当然 Laravel 没有写出报错的提示语。

附2:置于为什么有这个 .env?一开始,我也没有质疑,无所谓的样子,但实际是 Lavravl 的一个团队协作的考虑,具体参见:《关于 Laravel 项目里的 .env 文件的使用》。

附3:Laravel的帮助函数都位于 vendor/laravel/framework/src/Illuminate/Foundation/helpers.php。

附4:.env 中包含了重要配置,比如数据库mysql 的配置,开发提前设置,但团队开发请注意附2。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息