当前位置: 首页 > news >正文

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

075541_gdu9_32037.png

 

// 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。

转载于:https://my.oschina.net/zhmsong/blog/900617

相关文章:

  • 判断窗体 show完成
  • java.util.Date和java.sql.Date的区别和相互转化 (转)
  • 如何用Python批量发现互联网“开放”摄像头
  • 《深入理解Android 卷III》第四章 深入理解WindowManagerService
  • Android内存泄露分析之StrictMode
  • Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
  • AC日记——[NOIP2015]运输计划 cogs 2109
  • 白话空间统计之四:P值和Z值(上):零如果
  • “取出数据表中第10条到第20条记录”的sql语句+select top 使用方法
  • 如何优雅地修改多模块maven项目中的版本号?
  • 配置 yum 源的两种方法(比较全)
  • webpack简介与使用
  • umask函数的使用方法 - 怎样进行权限位的设置
  • 深入理解Activity启动流程(二)–Activity启动相关类的类图
  • 关于 Linux 进程你所需要知道的一切
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 11111111
  • C# 免费离线人脸识别 2.0 Demo
  • canvas绘制圆角头像
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Less 日常用法
  • LintCode 31. partitionArray 数组划分
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue--为什么data属性必须是一个函数
  • Yeoman_Bower_Grunt
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 动态魔术使用DBMS_SQL
  • 多线程事务回滚
  • 开发基于以太坊智能合约的DApp
  • 聊聊directory traversal attack
  • 说说动画卡顿的解决方案
  • 微信小程序实战练习(仿五洲到家微信版)
  • 我有几个粽子,和一个故事
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​Linux·i2c驱动架构​
  • ​人工智能书单(数学基础篇)
  • #Lua:Lua调用C++生成的DLL库
  • (175)FPGA门控时钟技术
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)c52学习之旅-简单了解单片机
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)图像的%2线性拉伸
  • (一)RocketMQ初步认识
  • (已解决)什么是vue导航守卫
  • (转)重识new
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例