要明白的知识点
- 在哪里定义APP_ENV这个环境变量,它有什么作用,它与环境文件什么关系
- 在哪里定义应用的环境
- 了解环境文件路径,环境文件,应用环境这几个概念
预备知识
在application中与环境相关的属性有两个
-
$environmentPath
环境路径,默认为basePath
,useEnvironmentPath($path)
设置,environmentPath()
获取 -
$environmentFile
,环境文件名,默认是.env
,loadEnvironmentFrom($file)
设置,environmentFile()获取 - 获取完整的环境文件的方法是
environmentFilePath()
,默认返回项目根目录/.env
这个文件
与环境相关的两个bootstrapper
LoadEnvironmentVariables
加载环境变量,将环境文件中的配置写到全局变量$_ENV和$_SERVER中,其实这个配置是为下面的加载配置服务的,可以在配置文件中使用env来读取环境文件中定义的值
LoadConfiguration
加载配置,读取/config下面所有的配置文件,放到$Aapp[‘config’]中,以便在任何地方可以读取相关配置,其中config/app.php这个文件是必须要定义的
加载环境变量LoadEnvironmentVariables
- 当配置文件缓存了就不用执行,会跳过这一步,也就是说LoadEnvironmentVariables是为配置文件服务的
- 第一个特殊的环境变量
APP_ENV
, 它决定着应用环境和将哪个环境文件中的值放到全局常量$_ENV和$_SERVER中,环境文件中的配置可以在配置文件中使用env()的方式获取- 根据env(‘APP_ENV’)找到相应用环境文件,使用第三方库Dotenv将该环境文件中的配置保存到$_ENV和$_SERVER中,查看源代码,实际上使用apache中的apache_setenv函数或php的putenv函数,另外存在$_ENV和$_SERVER这两个全局常量中
如何设置环境变量APP_ENV?
应用有console和web两种运行方式,在console命令行工作方式使用 –env来指定当前应用环境,在web运行方式时,一般在web服务器中指定,如apache中 使用SetEnv APP_ENV xxxx
如果使用homestead环境,可以
variables:
- key: 'APP_ENV'
value: 'home'
如果指定了APP_ENV这个环境变量,如env(‘APP_ENV’)的值为home,那么环境文件就是 项目根目录/.env.home
也就是说不同的环境APP_ENV对应不同的环境文件
总结
总结1:如果定义APP_ENV这个环境变量,如env(‘APP_ENV’)的值为wang, 就将么环境文件为 .env.wang里的配置转为全局常量$_ENV和$_SERVER中
总结2:如果没用定义APP_ENV这个环境变量,那么就将.env这个文件中的配置保存全局常量$_ENV和$_SERVER中
总结3:如果上面两种都没有,一般会报错,laravel默认也可以执行,不捕获这个错误
应用环境
设置应用环境: detectEnvironment(Closure $callback),最终保存在$app[‘env’]中
获取应用环境: environment()
判断是否是local环境: isLocal()
判断是否是test环境:runningUnitTests()
在哪里设置应用环境呢,laravel在LoadConfiguration这个bootstrapper的bootstrap()中定义的,事实上它是读取配置文件config/app下面env的值,如果没设就返回production
在配置文件app.env中指定,'env' => env('APP_ENV', 'production')
, 它的意思是,如果指定了APP_ENV,那么应用环境就是APP_ENV的值,没有指定,就是production。如果在app.env中也没有指定,那么laravel在LoadConfiguration时中会将其指定为production,也就是$app[‘env’]有三个地方可以指定
课后思考
- 应用环境是不是必须要指定?
- 指定应用环境的几个步骤