[译]Laravel 5.0 之运行环境及环境变量
本文译自 Matt Stauffer 的系列文章.
如果你关注我的博客有段时间了,那你应该曾经见过我在 Laravel 环境检测问题上的各种尝试,特别使用环境变量进行检测这方面。例子
感谢 Laravel 5, 它极大地简化了环境检测环节。在 4.x 版的时候,你要创建多个基于运行环境名称的环境配置文件(比如 .env.php
, .env.local.php
等)。老实说,我从来用过这个功能。但我觉得理论上你应该会把所有环境配置文件提交到代码库。但由于我们从来不提交任何环境配置文件,所以这种区分环境的手段毫无用处,而且它还会造成环境配置文件的延迟加载,因为只有检测到运行于什么环境之后,它才能进行相应的配置文件加载。
PHP dotenv 介绍
Laravel 5.0 其实也没做什么特别的创新,它只是使用了 PHP dotenv, 一个从单一 .env
文件中加载环境配置的第三方库。
新版本的 Laravel 初始框架包含一个默认的 .env.example
文件,这个文件暂时看起来长这样:
APP_ENV=local
APP_KEY=SomeRandomString
DB_USERNAME=homestead
DB_PASSWORD=homestead
要使用这个功能,只需要复制这个文件并重命名为 .env
(类似 wordpress 的 wp-config-sample.php). 为什么不直接重命名原始文件而是先复制再重命名呢?下面马上就要说到了。
接下来,就可以编辑 APP_ENV
的值来指定运行环境了。这是在 Laravel 5.0 中我们指定应用运行环境名称的主要手段。可以看一下 bootstrap/environment.php
里最新的环境监测代码,它非常简单:
$env = $app->detectEnvironment(function()
{
return getenv('APP_ENV') ?: 'production';
});
这么简单,多美好的一件事!
自定义环境配置文件
现在回答刚才的那个问题:为什么不直接重命名 .env.example
这个原始文件呢?想象一下,假设你的应用要定义 10 个环境变量,怎么确保它被部署到不同运行环境下时都能保证定义了这些环境变量呢?当然,你可以在捡测到环境变量没定义的时候进行容错处理。但更好的处理方式还是定义这些变量。
这种情况下,你打算在那里做每个部署的 .env
文件的变量配置说明呢?一种方式:你可以写在 readme 文件里。更好的办法是更新 .env.example
文件,在里面加上你的应用需要定义的环境变量以及相应的注释。
如此一来,如果在应用的每个部署都定义 10 个环境变量,那就把这 10 个环境变量加到你的 .env.example
文件里,指定默认值。这个默认文件会提交到你的版本管理工具中。然后每次进行部署时只要执行 cp .env.example .env
命令,然后对 .env
中的变量值进行修改即可。
变量引用
如果需要了解更多,可以查看 PHP dotenv 的文档,但我可以告诉你一个最有用的技巧:一个已定义的环境变量是可以在后续的环境变量值中引用的。看一下他们的说明文档中的例子:
BASE_DIR=/var/webroot/project-root
CACHE_DIR=$BASE_DIR/cache
LOG_DIR=$BASE_DIR/logs
很直观。
指定必须定义的变量
某些变量是系统运行不可或缺的。对于这种情况,我们可以指定他们是必须定义的,而不是等应用开始用到这些变量时才发现没有定义而造成崩溃:
Dotenv::required('DB_USERNAME');
// 或者
Dotenv::required(['DB_HOST', 'DB_NAME', 'DB_USERNAME', 'DB_PASSWORD']);
通过 Dotenv::required()
方法指定即可,参数可以是单个字符串或者是字符串数组,每个字符串代表一个环境变量名。如果某个环境变量没有定义,系统会抛出一个 RuntimeException
.
写在最后
简单,易用,强大。而且这个新特性让我之前所有关于 Laravel 框架运行环境检测的文章、实践和抱怨都失去了意义。如今你可以很轻松地定义自己的运行环境名称和环境变量,而且是在单一的一个文件中,以一种可预期的,始终一致的方式来实现。
- 使用dict和set
- 区块链技术(二):以太坊编程语言Solidity安装及入门初体验
- SQL注入测试神器sqlmap
- 人工智能也分强与弱?
- 【Scikit-Learn 中文文档】集成方法 - 监督学习 - 用户指南 | ApacheCN
- 2017黑科技 颠覆生活哪家强?
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
- ASP.NET MVC的View是如何呈现出来的[实例篇]
- 把人类向机器人乞讨,变成对机器人征税
- 印度6大科技真相 会让很多人大吃一惊
- 了解ASP.NET MVC几种ActionResult的本质:HttpStatusCodeResult & RedirectResult/RedirectToRouteResult
- Python原创0基础入门一看几张图就学会了
- ASP.NET Core中的依赖注入(5):ServicePrvider实现揭秘【补充漏掉的细节】
- 了解ASP.NET MVC几种ActionResult的本质:FileResult
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 第十六章 分布式爬虫--准备工作
- go 搭建并行处理管道
- 新一代基于大数据的管理信息系统(MIS)报表需求开发
- 3. docker-compose实战--ghost app
- 2.1 Kubernetes--Pod
- 3. Kubernetes集群安装
- macOS VirtualBox 桥接模式 设置静态ip 且能和联网
- 重新初始化k8s master节点
- 5.k8s基本命令汇总
- 6. k8s + jenkins 实现持续集成(完)
- 7. 复制k8s Node节点 并重新初始化k8s-nodes2节点 (k8s连载)
- 8.k8s连载--重新生成k8s token(kubeadm join报错及解决)
- 3. dcoker容器的命令
- 4. 镜像的原理
- 5.docker容器数据卷