Laravel源码入门-启动引导过程(六)LoadEnvironmentVariables
2017-05-15 20:49
477 查看
在 《Laravel源码入门-启动引导过程(五)$kernel->handle($request)》中第一个要载入的是 LoadEnvironmentVariables,也就是 Foundation\Http\Kernel::bootstrapers[] 的第一个,\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables,如下:
我们再直接贴出 LoadEnvironmentVariables 类的代码,进行分析,非常直观,如下:
完成后,我们就可以使用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。
// 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。
相关文章推荐
- Laravel源码入门-启动引导过程(三)bootstrap/app.php
- Laravel源码入门-启动引导过程(八)HandleExceptions
- Laravel源码入门-启动引导过程(九)RegisterFacades
- Laravel源码入门-启动引导过程(十一)BootProviders
- Laravel源码入门-启动引导过程(十二)Pipeline
- Laravel源码入门-启动引导过程(七)LoadConfiguration
- Laravel源码入门-启动引导过程(十)RegisterProviders
- Laravel源码入门-启动引导过程(一)public/index.php
- Laravel源码入门-启动引导过程(四)app/Http/Kernel.php
- Laravel源码入门-启动引导过程(五)$kernel->handle($request)
- Laravel源码入门-启动引导过程(二)bootstrap/autoload.php
- Laravel5.5源码详解 -- 数据库的启动与连接过程
- GRUB启动过程分析 & GRUB 引导程序配置
- Launcher3源码分析 — 启动过程
- Activity的启动过程之startActivity源码解析
- 笔记一:从Minix 2.0的启动过程角度,读源码。
- Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7)
- [android源码分析]bluez启动过程中的各种plugin的初始化(一)--__bluetooth_builtin数组所耍的花样
- [置顶] android源码4.4.2----系统启动过程分析
- Tomcat源码解读系列——Tomcat的核心组成和启动过程