laravel .env环境变量原理
介绍
对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的。Laravel 利用 Vance Lucas 的 PHP 库 DotEnv 使得此项功能的实现变得非常简单。当应用程序收到请求时,.env 文件中列出的所有变量将被加载到 PHP 的超级全局变量 $_ENV 中。
使用
你可以使用 env 函数检索这些变量的值。事实上,如果你查看 Laravel 的配置文件,你就能注意到有数个选项已经使用了这个函数:
'debug' => env('APP_DEBUG', false),
传递给 env 函数的第二个值是「默认值」。如果给定的键不存在环境变量,则会使用该值。
使用分析
我们可以先看一下助手函数 env
if (! function_exists('env')) {/*** Gets the value of an environment variable.** @param string $key* @param mixed $default* @return mixed*/function env($key, $default = null){return Env::get($key, $default);}
}
ENV::get 最终追踪到 EnvConstAdapter get
/*** Get an environment variable, if it exists.** @param string $name** @return \PhpOption\Option*/public function get($name){if (array_key_exists($name, $_ENV)) {return Some::create($_ENV[$name]);}return None::create();}
读取$_ENV内容,$_ENV是 通过环境提供给脚本的变量
/*** @xglobal $_ENV array** Variables provided to the script via the environment.* Analogous to the old $HTTP_ENV_VARS array (which is still available, but deprecated).** <p><a href="https://secure.php.net/manual/en/reserved.variables.php">* https://secure.php.net/manual/en/reserved.variables.php</a>*/
$_ENV = array();
写入$_ENV
bootstrap/app.php中
try {(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(dirname(__DIR__)))->bootstrap();} catch (Dotenv\Exception\InvalidPathException $e) {//}
Laravel\Lumen\Bootstrap\LoadEnvironmentVariables 中
<?phpnamespace Laravel\Lumen\Bootstrap;use Dotenv\Dotenv;
use Dotenv\Exception\InvalidFileException;
use Illuminate\Support\Env;
use Symfony\Component\Console\Output\ConsoleOutput;class LoadEnvironmentVariables
{/*** The directory containing the environment file.** @var string*/protected $filePath;/*** The name of the environment file.** @var string|null*/protected $fileName;/*** Create a new loads environment variables instance.** @param string $path* @param string|null $name* @return void*/public function __construct($path, $name = null){$this->filePath = $path;$this->fileName = $name;}/*** Setup the environment variables.** If no environment file exists, we continue silently.** @return void*/public function bootstrap(){try {$this->createDotenv()->safeLoad();} catch (InvalidFileException $e) {$this->writeErrorAndDie(['The environment file is invalid!',$e->getMessage(),]);}}/*** Create a Dotenv instance.** @return \Dotenv\Dotenv*/protected function createDotenv(){return Dotenv::create($this->filePath,$this->fileName,Env::getFactory());}/*** Write the error information to the screen and exit.** @param string[] $errors* @return void*/protected function writeErrorAndDie(array $errors){$output = (new ConsoleOutput)->getErrorOutput();foreach ($errors as $error) {$output->writeln($error);}die(1);}
}
我们可以看到 bootstrap方法是创建Dotenv实例,并且调用Dotenv实例的safeload方法,Dotenv::create参数的含义
$this->filePath, #env所在目录$this->fileName, #env名称,默认 .envEnv::getFactory() #laravel env相关的适配器工厂
由此我们可以自定义.env的位置和名称
safeload方法
/*** Load environment file in given directory.** @throws \Dotenv\Exception\InvalidPathException|\Dotenv\Exception\InvalidFileException** @return array<string|null>*/public function load(){return $this->loadData();}/*** Load environment file in given directory, silently failing if it doesn't exist.** @throws \Dotenv\Exception\InvalidFileException** @return array<string|null>*/public function safeLoad(){try {return $this->loadData();} catch (InvalidPathException $e) {// suppressing exceptionreturn [];}}/*** Load environment file in given directory.** @throws \Dotenv\Exception\InvalidPathException|\Dotenv\Exception\InvalidFileException** @return array<string|null>*/public function overload(){return $this->loadData(true);}/*** Actually load the data.** @param bool $overload** @throws \Dotenv\Exception\InvalidPathException|\Dotenv\Exception\InvalidFileException** @return array<string|null>*/protected function loadData($overload = false){return $this->loader->setImmutable(!$overload)->load();}
根据代码分析,safeLoad 中使用了 try {} catuch {} 捕获了异常,不会因为地址错误而报错,同时加载loadData,这里默认使用了loadData = true, 影响的Dotenv 创建的 DotenvVariables(array $adapters, $immutable)实例属性 $immutable值。我们通过追踪load方法,最终可以找到该方法:
/*** Set an environment variable.** @param string $name* @param string|null $value** @throws \InvalidArgumentException** @return void*/public function set($name, $value = null){if (!is_string($name)) {throw new InvalidArgumentException('Expected name to be a string.');}// Don't overwrite existing environment variables if we're immutable// Ruby's dotenv does this with `ENV[key] ||= value`.if ($this->isImmutable() && $this->get($name) !== null && $this->loaded->get($name)->isEmpty()) {return;}$this->setInternal($name, $value);$this->loaded->set($name, '');}
此时我们明白,如果$immutable = true的话,如果之前环境变量有了该值,后面的配置文件无法进行更改环境变量的值,如果没有该值进行添加
相关文章:
laravel .env环境变量原理
介绍 对于应用程序运行的环境来说,不同的环境有不同的配置通常是很有用的。Laravel 利用 Vance Lucas 的 PHP 库 DotEnv 使得此项功能的实现变得非常简单。当应用程序收到请求时,.env 文件中列出的所有变量将被加载到 PHP 的超级全局变量 $_ENV 中。 使…...
Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解
title: Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解 date: 2024/10/19 updated: 2024/10/19 author: cmdragon excerpt: app:templatesGenerated 是 Nuxt.js 的一个生命周期钩子,在模板编译到虚拟文件系统(Virtual File System, VFS)之后被调用。这个钩子允许…...
新时代AI桌宠:XGO Rider让你的办公室瞬间高大上
XGO Rider Luwu 智能打造了桌面双轮足式机器人 XGO Rider,这款全球首创的轮腿式桌面AI机器人,正在悄然改变我们的办公环境。它不仅是一个高科技玩具,更是一个能大幅提升工作效率和办公室科技感的智能助手。 XGO Rider 新时代“桌宠” micr…...
matlab的resample函数
MATLAB中resample函数用法 - 知乎 (zhihu.com) 主要是经常忘记了重采样时哪个是原采样率,哪个是重采样后的采样率(目标采样率)。这里记录下,目标采样率在前面!...
idea怎么取消自动打开项目
idea设置不自动打开项目 选择File>> Settings 选择Appearance & Behavior >> System Settings 去掉勾选的Reopen last project on startup...
蓄电池在线监测系统 各大UPS铅酸蓄电池监测 保障安全
蓄电池的不断普及,确实推动了蓄电池监控和管理技术的持续升级。蓄电池检测系统的研发为我们带来了诸多好处,这些好处主要体现在以下几个方面: 一、提高蓄电池管理的智能化水平 蓄电池检测系统通过实时监测蓄电池的电压、电流、温度等关键参数…...
Python基础Day13
1.字符串 count(x)统计x出现的次数 split(m,n)以括号内的m为分隔符,将字符串分开n1个字符串 strip删除两端的空格 lstrip删除左边空格 rstrip删除右边空格 join(m)以m为分隔符,将分割开的字符串组合成一个新的字符串 max()/min&am…...
有趣的css - 跷跷板加载动画
大家好,我是 Just,这里是「设计师工作日常」,今天分享的是使用 css 模拟一个跷跷板效果的加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面…...
与机器学习的邂逅--自适应神经网络结构的深度解析
引言 随着人工智能的发展,神经网络已成为许多应用领域的重要工具。自适应神经网络(Adaptive Neural Networks,ANN)因其出色的学习能力和灵活性,逐渐成为研究的热点。本文将详细探讨自适应神经网络的基本概念、工作原理…...
用python怎么实现办公自动化【批量生成出货清单】
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...
【Qt】控件——Qt输入类控件、常见的输入类控件、输入类控件的使用、Line Edit、Text Edit、Combo Box、Spin Box
文章目录 Qt5. Qt显示类控件Line EditText EditCombo BoxSpin BoxQDateTimeEditDialSlider Qt 5. Qt显示类控件 Line Edit QLineEdit 用于表示单行输入框。可以输入一段文本,但是不能换行。 属性说明text输入框中的文本inputMask输入内容格式约束maxLength最大长度…...
单臂交换知识点
要求:pc1要与pc2 ping通 命令: LSW1命令解析: system-view: 这个命令用于进入交换机的全局配置模式。在这个模式下,用户可以配置设备的全局设置。 vlan batch 10 20: 创建VLAN 10和VLAN 20。VLAN(虚拟局域网&#x…...
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源(由于网络问题,国内用户请使用清华大学…...
用python-pptx轻松统一调整演示文档配色方案
哈喽,大家好,我是木头左! 安装与准备:python-pptx入门 确保你的Python环境中已经安装了python-pptx库。如果没有,可以通过pip进行快速安装: pip install python-pptx此外,对于PPT文档的操作,了解一些基本的PowerPoint概念是有帮助的,比如幻灯片母版(Slide Master)…...
MySQL-30.索引-介绍
一.索引 为什么需要索引?当我们没有建立索引时,要在一张数据量极其庞大的表中查询表里的某一个值,会非常的消耗时间。以一个6000000数据量的表为例,查询一条记录的时间耗时约为13s,这是因为要查询符合某个值的数据&am…...
6-2.Android 对话框之基础对话框问题清单(UI 线程问题、外部取消、冲突问题、dismiss 方法与 hide 方法)
对话框 对话框(Dialog)是一种常用的 UI 组件,它主要用于显示信息、接收用户操作反馈 对话框可以包含各种元素,但是主要还是以文本、按钮为主,其次是列表 其中,基础对话框是 Android 中最简单的对话框&…...
git配置以及如何删除git
你努力学习和充实自己,除了提升自身的价值,最实际的是当遇到有喜欢的人和事的时候,除了一片真心,还有拿得出手的东西 作用 记录开发的历史,每次记录就是一个版本,而且可以回到历史的某个版本可以实现多人合…...
深入理解new Function
基础语法 let func new Function([arg1,arg2,arg3,...argN],functionBody)函数是通过使用参数 arg1…argN 和给定的 functionBody 创建。 调用 Function 时可以使用或不使用 new,两者都会创建一个新的 Function 实例 举例1: 带有两个参数的函数 let sum new Fun…...
服务器训练神经网络必备工具Screen使用教程
使用服务器训练网络时,不敢关闭终端窗口?用screen~ 服务器训练神经网络必备工具Screen使用教程 使用服务器训练网络时,不敢关闭终端窗口?用screen~一、Screen常用命令1. 启动新会话2. 重新连接会话3. 列出所有会话4. 窗口管理5. 断…...
跨越数字鸿沟,FileLink文件摆渡系统——您的数据安全高效传输新选择
在这个信息爆炸的时代,数据的流通与共享已成为推动各行各业发展的关键力量。然而,随着数据量的激增,如何在保证数据安全的前提下,实现高效、便捷的文件传输,成为了众多企业和个人用户面临的重大挑战。正是在这样的背景…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
