文档章节

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

zhmsong
 zhmsong
发布于 2017/05/15 20:49
字数 629
阅读 132
收藏 0

在 《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。

© 著作权归作者所有

zhmsong
粉丝 41
博文 126
码字总数 65130
作品 0
海淀
程序员
私信 提问
Laravel核心解读--Console内核

Console内核 上一篇文章我们介绍了Laravel的HTTP内核,详细概述了网络请求从进入应用到应用处理完请求返回HTTP响应整个生命周期中HTTP内核是如何调动Laravel各个核心组件来完成任务的。除了处...

KevinYan
2018/12/06
0
0
Laravel5.3之bootstrap源码解析

说明:Laravel在把Request通过送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享...

botkenni
2016/10/28
363
0
Laravel5.3之Session源码解析(中)

说明:在上篇中学习了session的启动过程,主要分为两步,一是session的实例化,即IlluminateSessionStore的实例化;二是从session存储介质redis中读取的数据。Laravel5.3把session垃圾回收放...

botkenni
2016/11/19
12
0
Laravel5.3之Session源码解析(下)

说明:在中篇中学习了session的CRUD增删改查操作,本篇主要学习关闭session的相关源码。实际上,在Laravel5.3中关闭session主要包括两个过程:保存当前URL到session介质中;在Response Head...

botkenni
2016/11/19
56
0
Ruby on Rails 和 Laravel: 入门

在线web应用程序开发目前有许多正流行的框架. 也有许多不同类型的框架,比如那些拥有大量插件,可以让你更加快速的迭代 (比如 Rails),或者还有其它非常简单和低级别的 (比如 Flask). web应用...

oschina
2014/07/07
5.2K
10

没有更多内容

加载失败,请刷新页面

加载更多

06_CSS入门和高级技巧(4)

复习 CSS : 负责样式层,层叠式样式表cascading style sheet。CSS2.1,最新版本CSS3。 CSS选择器: 选择哪些元素加样式。基本选择3种:标签p、id选择器#id、class选择器.;高级选择器4种:后...

王裕杰
18分钟前
1
0
IT兄弟连 Java语法教程 变量2

变量的作用域和生命周期 到目前为止,使用的所有变量都是在main()方法开始时声明的,然而,Java允许在任何代码块(代码块以开花括号开始,以闭花括号结束)中声明变量,代码块定义了作用域。...

老码农的一亩三分地
55分钟前
3
0
OSChina 周二乱弹 —— 这份躺着挣钱的工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :既然无法言说,不如一笑而过;既然无法释怀,不如安然自若。#今日歌曲推荐# 《Godi》- Lube 手机党少年们想听歌,请使劲儿戳(这...

小小编辑
今天
1K
21
Android沉浸式的两种方法

隐藏状态栏 一个Android应用程序的界面上其实是有很多系统元素的,观察下图: 而打造沉浸式模式的用户体验,就是要将这些系统元素全部隐藏,只留下主体内容部分。 怎么做呢,郭霖的一个Funct...

天王盖地虎626
今天
9
0
PostgreSQL build

https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=lumpsucker&dt=2019-06-23%2020%3A57%3A27...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部