Laravel|Lumen项目配置信息config原理

介绍

Laravel 框架的所有配置文件都保存在 config 目录中。每个选项都有说明,你可随时查看这些文件并熟悉都有哪些配置选项可供你使用。

使用

您可以在应用程序的任何位置使用全局 config 辅助函数轻松访问配置值。 可以使用"点"语法访问配置值,其中包括您希望访问的文件名和选项。 也可以指定默认值,如果配置选项不存在,将返回:

php 复制代码
$value = config('app.timezone');

// 如果配置值不存在,则检索默认值...
$value = config('app.timezone', 'Asia/Seoul');

使用分析

我们可以先看一下助手函数 config

php 复制代码
if (! function_exists('config')) {
    /**
     * Get / set the specified configuration value.
     *
     * If an array is passed as the key, we will assume you want to set an array of values.
     *
     * @param  array|string|null  $key
     * @param  mixed  $default
     * @return mixed
     */
    function config($key = null, $default = null)
    {
        if (is_null($key)) {
            return app('config');
        }

        if (is_array($key)) {
            return app('config')->set($key);
        }

        return app('config')->get($key, $default);
    }
}

分析

app('config') 是注册到服务容器的实例,这里我们追踪到config 的实例是

复制代码
Illuminate\Contracts\Config\Repository

Repository 的 set & get 方法代码如下

php 复制代码
    /**
     * Set a given configuration value.
     *
     * @param  array|string  $key
     * @param  mixed  $value
     * @return void
     */
    public function set($key, $value = null)
    {
        $keys = is_array($key) ? $key : [$key => $value];

        foreach ($keys as $key => $value) {
            Arr::set($this->items, $key, $value);
        }
    }

    /**
     * Get the specified configuration value.
     *
     * @param  array|string  $key
     * @param  mixed  $default
     * @return mixed
     */
    public function get($key, $default = null)
    {
        if (is_array($key)) {
            return $this->getMany($key);
        }

        return Arr::get($this->items, $key, $default);
    }

这时我们就可以清晰的知道,助手函数config(key = null, default = null)的含义:

  • 如果$key 不传或者传null,返回的是注册到服务容器中Repository实例

  • 如果$key 为数组,那么修改Repository 的 items的值

  • 其他情况 返回 Repository 的 items[key\] ?? default

  • 此时我们就可能有疑问 Repositiry 中 items 值是什么时候进行赋值的呢?赋的值又是那些呢?接下来我们一点点的分析

    绑定服务容器

    在laravel运行中,并没有直接绑定 Repositiry 到容器中,而是第一次构建config实例的时候进行了绑定,app('config') 或者 app()->make('config') 时检测是否进行绑定,如果没有的话进行绑定,下面时make函数:

    php 复制代码
        /**
         * Resolve the given type from the container.
         *
         * @param  string  $abstract
         * @param  array  $parameters
         * @return mixed
         */
        public function make($abstract, array $parameters = [])
        {
            $abstract = $this->getAlias($abstract);
    
            if (! $this->bound($abstract) &&
                array_key_exists($abstract, $this->availableBindings) &&
                ! array_key_exists($this->availableBindings[$abstract], $this->ranServiceBinders)) {
                $this->{$method = $this->availableBindings[$abstract]}();
    
                $this->ranServiceBinders[$method] = true;
            }
    
            return parent::make($abstract, $parameters);
        }

    根据代码可知

    php 复制代码
    $this->availableBindings['config'] = registerConfigBindings

    registerConfigBindings函数即为绑定到容器方法

    php 复制代码
        /**
         * Register container bindings for the application.
         *
         * @return void
         */
        protected function registerConfigBindings()
        {
            $this->singleton('config', function () {
                return new ConfigRepository;
            });
        }

    因此在调用make('config') 时若没有绑定,自动调用registerConfigBindings方法进行绑定

    配置文件赋值

    在bootstrap/app.php中,进行对配置文件进行了赋值,譬如:

    php 复制代码
    $app->configure('auth');
    $app->configure('permission');
    $app->configure('excel');
    $app->configure('database');

    configure函数为:

    php 复制代码
        /**
         * Load a configuration file into the application.
         *
         * @param  string  $name
         * @return void
         */
        public function configure($name)
        {
            if (isset($this->loadedConfigurations[$name])) {
                return;
            }
    
            $this->loadedConfigurations[$name] = true;
    
            $path = $this->getConfigurationPath($name);
    
            if ($path) {
                $this->make('config')->set($name, require $path);
            }
        }

    这里的操作就是将conf/$name.conf 的内容写到 Repositiry 中 items 值中

相关推荐
新鲜势力呀几秒前
TensorFlow 中 tf.placeholder 适用版本解析|附 PHP 调用 TF 模型实战(兼容低版本)
tensorflow·php·neo4j
catchadmin4 分钟前
当遇见 CatchAdmin V5-模块化设计重新定义 Laravel 后台开发
php·laravel
Qiuner11 分钟前
Spring Boot AOP (四)与事务、异常处理交互
spring boot·后端·交互
BingoGo15 分钟前
PHP 初学者指南 基础结构与常见错误
后端·php
码luffyliu16 分钟前
Go sync 标准库实战指南:吃透并发同步的核心工具
开发语言·后端·golang
JaguarJack17 分钟前
PHP 初学者指南 基础结构与常见错误
后端·php
草莓熊Lotso19 分钟前
C++ 异常完全指南:从语法到实战,优雅处理程序错误
android·java·开发语言·c++·人工智能·经验分享·后端
IT_陈寒20 分钟前
Python性能优化实战:7个让代码提速300%的冷门技巧(附基准测试)
前端·人工智能·后端
新鲜势力呀25 分钟前
低成本实现轻量级 Claude 风格对话交互 ——PHP 极简版开发详解
开发语言·php·交互
a努力。29 分钟前
小红书Java面试被问:如何设计一个分布式ID生成器
java·后端·面试