关于 Laravel 项目里的 .env 文件的使用

最近的所见让我觉得很多人实际上都在乱用 .env 文件,因为他们根本不明白当初从 .php 配置文件改成 .env 文件的原因。

大家都知道,在之前的版本 Laravel 是使用 config 文件夹下的 php 文件来完成项目所需要的配置的,后面从大概从 5 开始就使用了 .env 来放置部分配置。为啥要这样做呢?感觉增加了复杂度啊?

实际上,我们在开之前的版本开发过程中会遇到一些很常见的问题,比如两个人或者更多人在合作开发一个项目,数据库都使用本地的,但是由于数据库配置文件是在版本库中的,也就意味着每次拉代码下来以后都要修改一下配置文件的 host ,甚至账号,这是一个很尴尬的场景。这里出现这个场景的原因就是:应该随环境变化的东西被写死了

所以出现了使用 .env 配置文件,用以存储一些依赖环境的变量,比如数据库配置,因为它不会被加入到版本库中, 所以还用以配置一些敏感信息:比如正式环境的一些第三方应用账号,token 等。

但是现状却是,很多人在使用中想要把所有的配置(或者自己想要改动的配置)都写到 env 中,比如,数据库字符集、邮件标题。然而这些东西从本质上来讲它就应该是这个应用都统一的就不应该这么玩。

还有一件事顺便提一下,数据表前缀,实际上现在很多人已经不需要用它了,它的存在是很久以前大家多个项目共用一个数据库时才用前缀来区分,现在的应用基本都一个应用一个库,所以它已经是一个非常稀有的需求了,更不用说需要写到 .env 了。参见讨论:laravel/laravel#4042

一个简单的判断技巧:这项配置是不是需要每个环境都不一样?如果是就放到 env, 否则就写到 config 目录下就好了。

本帖已被设为精华帖!
本帖由 overtrue 于 7年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 27

@韩广超 .env 文件永远不会放到版本库,机器上留下一个就好了,要改到机器上去改 .env 就好(这属于部署环节了)。

7年前 评论
hareluya

顾及都是项目进度惹的祸,都没好好研究框架就上马了。

7年前 评论
leo

@匿名用户 第三方的不一定不能放.env中,有些有良心的第三方会提供线上和测试两套key,这种情况就可以放.env中

7年前 评论
chongyi

@overtrue 其实换句解释方式就是,在 .env.example 定义一个模板,不同环境下复制一份出来改就好咯

7年前 评论
沙渺

@韩广超 发布肯定需要另行拷贝.env文件。或者人肉,或者依赖发布(持续集成)工具。

以前上班时做过jenkins实现同一laravel项目、多个运行环境的持续部署(开发、测试、生产环境)。每一个环境的.env文件,都只存储在jenkins运行用机,不存储在版本库里。jenkins会在运行任务时,将任务对应的.env文件合并到代码中。

.env文件和代码分离,对于生产性质的应用是很重要的。在这个“github挖掘登录名/密码/key”不再是新鲜新闻的时代,我相信没有任何公司愿意承担由于开发者不慎,造成具体敏感信息泄露的风险。

7年前 评论

app_name 项为什么放入 env 呢 项目名我修改 app.config 不管用 这个不都是一样的吗 ? 反而修改 env 生效可以显示了

4年前 评论

数据表前缀确实,现在没有加的必要啊

7年前 评论

@overtrue 只是举例啦,有时候去 client 里写也不见得记得而已,这年代都没几个人会去写几句 sql了。

6年前 评论

@Tao 那是的,运行模式不一样

6年前 评论

@terranc 表名一般用复数,叫 users,然后表名与关键词重复其实也没问题(虽然这样不好),但是写标准的 SQL 时,表名与字段名通常带上反引号

6年前 评论

有个表前缀还是有有点的,比如 user 这个表,是关键词,有前缀就不必关注这些问题了。只是想打死那些前缀写很长的人。

6年前 评论

@overtrue 我用php -S启动服务 每次改完都要重启一次 ;用apache又没这问题

7年前 评论

@Tao 不需要

7年前 评论

。env文件修改完之后是不是需要重启http服务才行

7年前 评论

.env解析好慢的说,顺便推荐个.env.php可以充分利用opcache:phpdotenv-dotphp -- 求star

7年前 评论

还有人叫我写表前缀,都想打屎他了。。。:mask:

7年前 评论

先赞再评论

用以存储一些依赖环境的变量,比如数据库配置,因为它不会被加入到版本库中”

这里还有些疑问,.env不放到版本库,那就需要为每个环境都放一份不一样的.env文件了?

如果数据库配置改变了,不放到版本库,如何发布呢?

7年前 评论

@远客 大项目的历史遗留问题

7年前 评论
leo

@匿名用户 国内太少了,连微信支付都没有提供线下版本

7年前 评论

@leo 说到良心的第三方我就要吐槽了... 上周买了聚合的短信API 让他们把发票寄过来,竟然是到付... 发票申请里也没有说明,太坑了...快递电话来了还以为骗子,差点拒收

7年前 评论

很少在.env加额外配置,私有项目 第三方KEY OPENID 直接放在config里了

7年前 评论

现在确实用得少了。以前用空间时候用的多。

7年前 评论

数据库前缀这玩意就是很早之前遗留下来的东西,现在压根用不到了

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!