laravel5.1 如何检测出当前环境
在每次应用接受请求时,.env中列出的所有变量都会被载入到PHP超全局变量$_ENV中,然后你就可以在应用中通过帮助函数env来获取这些变量值。
Illuminate\Foundation\Http\Kernel文件中启动了检查当前环境的类 Illuminate\Foundation\Bootstrap\DetectEnvironment
代码如下
public function bootstrap(Application $app)
{
try {
Dotenv::load($app->environmentPath(), $app->environmentFile());
} catch (InvalidArgumentException $e) {
//
}
$app->detectEnvironment(function () {
return env('APP_ENV', 'production');
});
}
这段代码的意思为载入配置文件,然后读取配置文件中的环境参数APP_ENV,则默认环境为‘production’环境。(return env(‘APP_ENV’, ‘production’); 当APP_ENV变量不存在时返回默认值production。)
因为$app->environmentFile()的默认值为‘.env’,而项目上传时本地的‘.env’文件是不上传的,也就是说线上环境没有‘.env’文件。
再看detectEnvironment方法的定义
public function detectEnvironment(Closure $callback)
{
$args = isset($_SERVER['argv']) ? $_SERVER['argv'] : null;
return $this['env'] = (new EnvironmentDetector())->detect($callback, $args);
}
不对detect进行深究,最后是把
function () {return env('APP_ENV', 'production');}
这个闭包的值传递给了$this[‘env’]
$this[‘env’]这个变量暂时没有搞懂,应该是Application类里的属性什么的??
读取当前环境的environment方法定义如下
public function environment()
{
if (func_num_args() > 0) {
$patterns = is_array(func_get_arg(0)) ? func_get_arg(0) : func_get_args();
foreach ($patterns as $pattern) {
if (Str::is($pattern, $this['env'])) {
return true;
}
}
return false;
}
return $this['env'];
}
因此线上环境app()->environment() 的值为‘production’,线下的则由‘.env’文件中的APP_ENV决定,当然,如果线下的APP_ENV不存在,则返回的是‘production’。
在laravel5.1中,应用启动时会从.env文件加载变量到$_ENV,通过env助手函数获取。DetectEnvironment类用于检测环境,若APP_ENV不存在,则默认为'production'。detectEnvironment方法处理环境识别,将闭包结果存入$this['env'],而app()->environment()方法返回当前环境值,线上默认为'production',线下由.env文件的APP_ENV决定。
4626

被折叠的 条评论
为什么被折叠?



