文档章节

Laravel源码入门-启动引导过程(七)LoadConfiguration

zhmsong
 zhmsong
发布于 2017/05/17 12:50
字数 805
阅读 72
收藏 0

上文介绍了 LoadEnvironmentVariables,载入 .env 环境配置,在 《Laravel源码入门-启动引导过程(五)$kernel->handle($request)》中第二个要载入的是 LoadConfiguration,也就是 Foundation\Http\Kernel::bootstrapers[] 的第二个

\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, 如下:

// 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,
    ];

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

<?php

namespace Illuminate\Foundation\Bootstrap;

use Exception;
use SplFileInfo;
use Illuminate\Config\Repository;
use Symfony\Component\Finder\Finder;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Config\Repository as RepositoryContract;

class LoadConfiguration
{
    /**
     * Bootstrap the given application.
     * 引导注入的$app
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        $items = [];

        // First we will see if we have a cache configuration file. If we do, we'll load
        // the configuration items from that file so that it is very quick. Otherwise
        // we will need to spin through every configuration file and load them all.

        // 首先看看缓存路径存在否,如果不存在,循环 config/目录中的所有 .php 文件。
         
        if (file_exists($cached = $app->getCachedConfigPath())) {
            $items = require $cached;

            $loadedFromCache = true;
        }

        // Next we will spin through all of the configuration files in the configuration
        // directory and load each one into the repository. This will make all of the
        // options available to the developer for use in various parts of this app.

        // 循环之前,实例化一个 $config 仓库对象,注册到到 $app 上,共享。
         
        $app->instance('config', $config = new Repository($items));

        if (! isset($loadedFromCache)) {
            // 将 config 目录下的 所有 .php 配置信息 载入到 $config 中
            $this->loadConfigurationFiles($app, $config);
        }

        // Finally, we will set the application's environment based on the configuration
        // values that were loaded. We will pass a callback which will be used to get
        // the environment in a web context where an "--env" switch is not present.

        // 不懂这句。。。

        $app->detectEnvironment(function () use ($config) {
            return $config->get('app.env', 'production');
        });

        // 设置时区,下面注释语句应该一样
        // date_default_timezone_set($config->get('app.timezone'));

        date_default_timezone_set($config->get('app.timezone', 'UTC'));

        // 设置内部字符编码
        mb_internal_encoding('UTF-8');
    }

    /**
     * Load the configuration items from all of the files.
     * 从所有的 config/ 下的 .php 中 载入配置信息
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \Illuminate\Contracts\Config\Repository  $repository
     * @return void
     */
    protected function loadConfigurationFiles(Application $app, RepositoryContract $repository)
    {
        // 找到所有 .php 文件,尽管有子目录
        // 根据下面 getConfigurationFiles() 得到了所有文件的 $key=>$path 对
        // 比如:
/*
  "app" => "/Users/me/mydev/laravel_orig/config/app.php"
  "auth" => "/Users/me/mydev/laravel_orig/config/auth.php"
  "broadcasting" => "/Users/me/mydev/laravel_orig/config/broadcasting.php"
  "cache" => "/Users/me/mydev/laravel_orig/config/cache.php"
  "config_test.config_test" => "/Users/me/mydev/laravel_orig/config/config_test/config_test.php"
  "config_test.config_test_2.config_test2" => "/Users/me/mydev/laravel_orig/config/config_test/config_test_2/config_test2.php"
  "database" => "/Users/me/mydev/laravel_orig/config/database.php"
  "filesystems" => "/Users/me/mydev/laravel_orig/config/filesystems.php"
  "mail" => "/Users/me/mydev/laravel_orig/config/mail.php"
  "queue" => "/Users/me/mydev/laravel_orig/config/queue.php"
  "services" => "/Users/me/mydev/laravel_orig/config/services.php"
  "session" => "/Users/me/mydev/laravel_orig/config/session.php"
  "view" => "/Users/me/mydev/laravel_orig/config/view.php"
*/
        $files = $this->getConfigurationFiles($app);

        if (! isset($files['app'])) {
            throw new Exception('Unable to load the "app" configuration file.');
        }

        foreach ($files as $key => $path) {
            $repository->set($key, require $path);
        }
    }

    /**
     * Get all of the configuration files for the application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return array
     */
    protected function getConfigurationFiles(Application $app)
    {
        $files = [];

        $configPath = realpath($app->configPath());

        foreach (Finder::create()->files()->name('*.php')->in($configPath) as $file) {
            $directory = $this->getNestedDirectory($file, $configPath);

            $files[$directory.basename($file->getRealPath(), '.php')] = $file->getRealPath();
        }

        return $files;
    }

    /**
     * Get the configuration file nesting path.
     *
     * @param  \SplFileInfo  $file
     * @param  string  $configPath
     * @return string
     */
    protected function getNestedDirectory(SplFileInfo $file, $configPath)
    {
        $directory = $file->getPath();

        if ($nested = trim(str_replace($configPath, '', $directory), DIRECTORY_SEPARATOR)) {
            $nested = str_replace(DIRECTORY_SEPARATOR, '.', $nested).'.';
        }

        return $nested;
    }
}

 

至此所有的配置信息导入完成。

 

© 著作权归作者所有

共有 人打赏支持
zhmsong
粉丝 40
博文 126
码字总数 65130
作品 0
海淀
程序员
私信 提问
Laravel5.3之bootstrap源码解析

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

botkenni
2016/10/28
363
0
Laravel核心解读--Console内核

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

KevinYan
2018/12/06
0
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

没有更多内容

加载失败,请刷新页面

加载更多

详解webpack-dev-server的简单使用

webpack-dev-server是一个小型的Node.js Express服务器,它使用webpack-dev-middleware来服务于webpack的包,除此自外,它还有一个通过Sock.js来连接到服务器的微型运行时. 我们来看一下下面的...

前端攻城老湿
21分钟前
0
0
深度解析JavaScript事件对象

这篇文章主要介绍了JavaScript事件对象,结合实例形式深入分析了javascript DOM、IE及其他浏览器相关事件对象操作技巧与注意事项,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可...

前端攻城小牛
22分钟前
0
0
Android下拉刷新开源框架

添加依赖 //下拉刷新 implementation 'com.jcodecraeer:xrecyclerview:1.5.9' xml引用 <com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/act_xrecycler......

lanyu96
29分钟前
0
0
Linux内核中ioremap映射的透彻理解

几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两...

天王盖地虎626
32分钟前
1
0
Collection中的之retainAll()方法的理解

//在jdkapi中的方法,说明返回值为boolean类型, boolean retainAll(Collection<?> c) ; //api中给的注释 //Retains only the elements in this list that are contained in the specified......

南桥北木
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部