文档章节

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

zhmsong
 zhmsong
发布于 2017/05/15 20:49
字数 629
阅读 72
收藏 0
点赞 1
评论 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
海淀
程序员
Laravel5.3之bootstrap源码解析

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

botkenni ⋅ 2016/10/28 ⋅ 0

Laravel5.3之Session源码解析(中)

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

botkenni ⋅ 2016/11/19 ⋅ 0

Laravel5.3之Session源码解析(下)

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

botkenni ⋅ 2016/11/19 ⋅ 0

Mac下安装PHP的mcrypt扩展的方法(自己总结的)

在安装Laravel时,由于没有安装PHP的mcrypt扩展,所以导致了报错,折腾了好久,终于找到了完美的安装方法,现总结归纳如下: 报错: Problem 1 - laravel/framework v5.0.9 requires ext-mc...

Corwien ⋅ 2016/04/23 ⋅ 0

Laravel 5.1 源码阅读

安装,和创建项目,都是通过Composer,简单,略过。 Entry && Kernel 网站入口文件,${Laravel-project}/public/index.PHP: 生成Request,处理Request(),生成Response,发送Resonse。常规...

botkenni ⋅ 2016/10/09 ⋅ 0

Laravel5.2之Redis保存页面浏览量

说明:本文主要讲述使用Redis作为缓存加快页面访问速度。同时,会将开发过程中的一些截图和代码黏上去,提高阅读效率。 备注:最近在学习github上别人的源码时,发现好多在计算一篇博客页面访...

botkenni ⋅ 2016/10/21 ⋅ 0

Laravel框架一:原理机制篇

http://www.cnblogs.com/XiongMaoMengNan/p/6644892.html Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特点。 一. 请求周期   Laravel 采用了单一入口模式,应用...

hisense20112784 ⋅ 2017/08/11 ⋅ 0

Laravel 4 入门三讲(上)laravel 在启动的时候到底做了什么?

  在 Laravel 4 的官方文档里介绍了如何快速的使用它来开始程序的开发。然而相对于如何快速的输出“Hello Word!”笔者更关心的,是在执行到“Hello Word!”这句代码之前程序都做了哪些事情...

成武 ⋅ 2013/11/26 ⋅ 5

Laravel5.3之Session源码解析(上)

说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助。Laravel在中定义了session中间件,并通过该中间件来设计sessi...

botkenni ⋅ 2016/11/18 ⋅ 0

Laravel5.2队列驱动expire参数设置带来的重复执行问题 数据库驱动

'connections' => [ .... 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'expire' => 60, ], 'redis' => [ 'driver' => 'redis',......

daweilang ⋅ 2017/05/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 18分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 24分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 27分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 35分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 38分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 今天 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 今天 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部