laravel的vlucas/phpdotenv源码解读

本文深入探讨laravel框架中的vlucas/phpdotenv库,详细解析.env文件加载流程。从 Dotenv 类的实例化,到 Loader 类的使用,逐行分析源码,包括检查文件可读性、过滤数据、设置环境变量等关键步骤,揭示.env配置如何影响PHP全局环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在我们开始一一解读phpdotenv中的源码
首先在 bootstarp/app.php中(new Dotenv\Dotenv(DIR ))->load()
我们先来解读这一行代码的执行流程
这里写图片描述
首先是实例化了Dotenv这个类以及传入当前项目路径得到一个Dotenv类的实例,实例中的this>getFilePath(this−>getFilePath(path,file)这个方法中就是把pathpath与file拼接得到一个.env的文件地址赋值给这个实例中的filePath
第二行就是去new 一个Loader类.这个类也就是跟Dotenv类同一个目录下的,这个类主要实现了读取文件中的内容到php的ENVENV_SERVER全局变量中.
这里写图片描述
这是Loader类的构造方法,该构造方法中第二个参数主要控制不可变的变量,
接下来就是调用Dotenv中的load方法了.
这里写图片描述
load方法中继续调用了loaData()方法
这里写图片描述
在loadData方法中又获取了一下Load类的实咧,然后通过得到的load实例再去调用了Load类中的load方法.
这里写图片描述
这个方法中主要实现了整个文件的一个过滤读取 然后存入php全局变量中
现在就来一一解读下这个方法中的实现
第一行调用的ensureFileIsReadable该方法就是检查$this->filePath是否是一个文件以及是否可读.然后调用了readLinesFromFile方法
这里写图片描述
这个方法就是通过file函数读取文件中的内容,并以数组形式返回.
接下来就是遍历这个数组,最后返回.
在遍历数组当中还做了很多的一些操作,首先就是过滤.env文件中的注释行 以及不是以一种键值对的形式的数据.
最后执行setEnvironmentVariable这个方法.通过方法名能理解就是把.env中可用的配置存入到环境变量当中,我们现在来看看这个方法又做了哪些操作呢
这里写图片描述
normaliseEnvironmentVariable 方法参数$name是一个字符串
这里写图片描述
这个方法的第一个步是通过传入的字符串截取成一个数组返回分别赋值给list中的两个变量
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这个sanitiseVariableValue方法看着就是去除一些字符串中的特殊符号什么已达到防止一些恶意的攻击.
这里写图片描述
改方法主要就是解析出嵌套的变量.然后回到setEnvironmentVariable方法
紧接着 当如果immutable这个变量为true时 就要去检查当前php环境中的ENVENV_SERVER getenv() 全局变量中跟php的环境变量中是否已经有这个$name值了.如果有的话就返回不往下执行了.
这里写图片描述
在接下来 方法中就是判断项目是否在apache环境下,现在基本都是使用nginx WEB服务器,所以这里就不做解释了.
最后几行就是把.env文件中的键值对 分别存入env ENVENV以及_SERVER当中.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值