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

news2024/10/24 4:23:58

介绍

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

使用

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

$value = config('app.timezone');

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

使用分析

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

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 方法代码如下

    /**
     * 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函数:

        /**
         * 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);
        }
    

    根据代码可知

    $this->availableBindings['config'] = registerConfigBindings
    

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

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

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

    配置文件赋值

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

    $app->configure('auth');
    $app->configure('permission');
    $app->configure('excel');
    $app->configure('database');
    

    configure函数为:

        /**
         * 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 值中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

huggingface的数据集下载(linux下clone)

1. 安装lfs sudo apt-get install git-lfs 或者 apt-get install git-lfs 2. git lfs install git lfs install 3. git clone dataset包 第2,3步骤的截图如下:

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题,国内用户请使用清华大学…

架构设计笔记-21-案例分析

1.遗留系统策略 / 数据迁移 / REST和RPC风格 2.分布式系统 / 分布式对象调用 3.开放式架构 / GOA 4.ESB 5.FMEA故障分析 6. 加密 / 公钥体系机制 / 加解密API和透明加密 7.嵌入式系统故障 / 故障滤波算法 / 容错算法 8.开源框架struts / spring / Hibenate 9.企业应用集成 10.T…

Python 应用可观测重磅上线:解决 LLM 应用落地的“最后一公里”问题

作者:彦鸿 背景 随着 LLM(大语言模型)技术的不断成熟和应用场景的不断拓展,越来越多的企业开始将 LLM 技术纳入自己的产品和服务中。LLM 在自然语言处理方面表现出令人印象深刻的能力。然而,其内部机制仍然不明确&am…

2023 WMCTF pwn【blindless jit】

文章目录 blindlessIDA结构体命名逆向漏洞方法1方法2 exp jitstrtol(v9, &endptr, 16)__errno_location和__throw_out_of_range详细解释: __errno_location相关具体操作详细分析为什么要执行上述代码?示例代码段的解释 _acrt_iob_funcSetProcessMiti…

Vue.js 学习总结(9)—— Vue 3 组件封装技巧

1、需求说明 需求背景:日常开发中,我们经常会使用一些UI组件库诸如and design vue、element plus等辅助开发,提升效率。有时我们需要进行个性化封装,以满足在项目中大量使用的需求。错误示范:基于a-modal封装一个自定…

MinIO安装教程

MinIO简介 Minio是一个开源的、云原生的分布式对象存储系统,是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。 它一大特点就是轻量,虽然轻量,却拥有着不…

适合忙碌职场人的进度计划工具

明确的进度计划是一种约束机制,职场人往往面临多项任务,通过进度计划管理,可以将工作按照优先级和时间要求进行分解,而进度计划管理可以很好地帮助职场人发现时间浪费的环节。此外,对于忙碌的职场人来说,不…

基于K8S的StatefulSet部署mysql主从

StatefulSet特性 StatefulSet的网络状态 拓扑状态:应用的多个实例必须按照某种顺序启动,并且必须成组存在,例如一个应用中必须存在一个A Pod和两个B Pod,且A Pod必须先于B Pod启动的场景 存储状态:应用存在多个实例&…

《使用Gin框架构建分布式应用》阅读笔记:p88-p100

《用Gin框架构建分布式应用》学习第6天,p88-p100总结,总计13页。 一、技术总结 1.MongoDB CRUD操作 (1)InsertOne(), InsertMany() (2)Find() (3)UpdateOne, UpdateMany() (4)DeleteOne(), DeleteMany() 2.MongoDB primitive p96,rec…

Docker 基础入门

Docker 基础入门 前言 在云计算和微服务架构日益盛行的今天,软件开发与部署的效率和灵活性成为了企业竞争力的关键因素之一。Docker,作为一种开源的容器化平台,凭借其轻量级、可移植性和易于管理的特性,迅速成为现代软件开发和运…

pdf编辑软件有哪些?方便好用的pdf编辑软件分享

PDF文件因其跨平台、格式固定的特性,成为了工作、学习和生活中不可或缺的一部分。然而,随着需求的不断增加,仅仅阅读PDF文件已难以满足我们的需求,编辑、转换PDF文件成为了新的焦点,下面给大家分享几款方便好用的PDF编…

vue3处理货名的拼接

摘要: 货品的拼接规则是:【品牌】货名称/假如货品名称为空时,直接选择品牌为【品牌】赋值给货品,再选择品牌,会替换【品牌】;假如货名称为【品牌】名称,再选择品牌只会替换【品牌】,…

Windows系统PyCharm右键运行.sh文件

在参考了Windows系统下pycharm运行.sh文件,执行shell命令_shell在pycharm-CSDN博客 和深度学习:PyCharm中运行Bash脚本_pycharm bash-CSDN博客 配置了右键执行.sh文件之后,发现在Windows的PyCharm中直接右键运行sh文件,存在如下…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同,布隆过滤器无法删除元素,并且会存在一定的误判率&…

【重学 MySQL】六十七、解锁检查约束,守护数据完整性

【重学 MySQL】六十七、解锁检查约束,守护数据完整性 检查约束的基本概念检查约束的语法检查约束的使用场景注意事项示例 在MySQL中,检查约束(CHECK)是一种用于确保表中数据满足特定条件的约束。 检查约束的基本概念 检查约束用…

【Next.js 项目实战系列】05-删除 Issue

原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js 项目实战系列】04-修改 Issue 删除 Issue 添加删除 Button​ 本节代码链接 这里我们主要关注布局…

IPC 管道 Linux环境

管道通信的特点: 1. 单工通信---- 任何一个时刻只能发送方 向 接收方发送数据 2. 流式传输: 1> 先发送的数据先被接收,不能跳跃式接收 ----- 顺序发送顺序接收 2> 未被接收的数据仍然滞留在管道中,下一次可以继续接收后…

与ai一起作诗(《校园清廉韵》)

与ai对话犹如拷问自己的灵魂,与其说ai助力还不如说在和自己对话。 (笔记模板由python脚本于2024年10月19日 19:18:33创建,本篇笔记适合喜欢python和诗歌的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&…

免费开源Odoo软件如何实现电商仓库高效发货

世界排名第一的免费开源ERP软件Odoo,拥有非常强大的仓库管理WMS功能。本文以电商仓库发货管理为例,介绍电商订单的仓库发货作业的各种方法。电商订单仓库发货流程,通常分为三个步骤,即拣货、打包、发货。根据仓库日处理订单数量的…