laravel5.1 如何检测出当前环境

在laravel5.1中,应用启动时会从.env文件加载变量到$_ENV,通过env助手函数获取。DetectEnvironment类用于检测环境,若APP_ENV不存在,则默认为'production'。detectEnvironment方法处理环境识别,将闭包结果存入$this['env'],而app()->environment()方法返回当前环境值,线上默认为'production',线下由.env文件的APP_ENV决定。

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’。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值