How the environment variables in the Lumen/Laravel. env file take effect

Source: Internet
Author: User

How the environment variables in the Lumen/Laravel. env file take effect

The. env file can be used to customize any other valid environment variables. You can call env (), $ _ SERVER, or $ _ ENV to obtain the variables. So how does env () load these variables? In Lumen's vendor/laravel/lumen-framework/src/helpers. php, we can find that the env function is defined as follows:

if (! function_exists('env')) {    /**     * Gets the value of an environment variable. Supports boolean, empty and null.     *     * @param  string  $key     * @param  mixed   $default     * @return mixed     */    function env($key, $default = null)    {        $value = getenv($key);        if ($value === false) {            return value($default);        }        switch (strtolower($value)) {            case 'true':            case '(true)':                return true;            case 'false':            case '(false)':                return false;            case 'empty':            case '(empty)':                return '';            case 'null':            case '(null)':                return;        }        if (Str::startsWith($value, '"') && Str::endsWith($value, '"')) {            return substr($value, 1, -1);        }        return $value;    }}

It can be seen that the env function calls getenv () to read environment variables. We also know that getenv () is a function API provided by PHP to read the global variables of $ _ SERVER or $ _ ENV ,. why can the environment variables in the env file be obtained through getenv? Vlucas/phpdotenv is the hero behind the scenes. She can be found under Lumen or Laravel's vender. If you want to download her separately, go here: https://github.com/vlucas/phpdotenv.

In the vlucas/phpdotenv/src/Loader. php file, we can see that. env is loaded into an array, and each row is treated as a setter and the setEnvironmentVariable () method is called:

/**     * Load `.env` file in given directory.     *     * @return array     */    public function load()    {        $this->ensureFileIsReadable();        $filePath = $this->filePath;        $lines = $this->readLinesFromFile($filePath);        foreach ($lines as $line) {            if (!$this->isComment($line) && $this->looksLikeSetter($line)) {                $this->setEnvironmentVariable($line);            }        }        return $lines;    }/**     * Read lines from the file, auto detecting line endings.     *     * @param string $filePath     *     * @return array     */    protected function readLinesFromFile($filePath)    {        // Read file into an array of lines with auto-detected line endings        $autodetect = ini_get('auto_detect_line_endings');        ini_set('auto_detect_line_endings', '1');        $lines = file($filePath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);        ini_set('auto_detect_line_endings', $autodetect);        return $lines;    }

 

Loader: setEnvironmentVariable ($ name, $ value = null) is defined as follows:

/**     * Set an environment variable.     *     * This is done using:     * - putenv,     * - $_ENV,     * - $_SERVER.     *     * The environment variable value is stripped of single and double quotes.     *     * @param string      $name     * @param string|null $value     *     * @return void     */    public function setEnvironmentVariable($name, $value = null)    {        list($name, $value) = $this->normaliseEnvironmentVariable($name, $value);        // Don't overwrite existing environment variables if we're immutable        // Ruby's dotenv does this with `ENV[key] ||= value`.        if ($this->immutable && $this->getEnvironmentVariable($name) !== null) {            return;        }        // If PHP is running as an Apache module and an existing        // Apache environment variable exists, overwrite it        if (function_exists('apache_getenv') && function_exists('apache_setenv') && apache_getenv($name)) {            apache_setenv($name, $value);        }        if (function_exists('putenv')) {            putenv("$name=$value");        }        $_ENV[$name] = $value;        $_SERVER[$name] = $value;    }

 

  PHP dotenv what is she?

Loads environment variables from .env to getenv(), $_ENV and $_SERVER automagically.This is a PHP version of the original Ruby dotenv.

  Why. env?

You should never store sensitive credentials in your code. Storing configuration in the environment is one of the tenets of a twelve-factor app. Anything that is likely to change between deployment environments – such as database credentials or credentials for 3rd party services – should be extracted from the code into environment variables.Basically, a .env file is an easy way to load custom configuration variables that your application needs without having to modify .htaccess files or Apache/nginx virtual hosts. This means you won't have to edit any files outside the project, and all the environment variables are always set no matter how you run your project - Apache, Nginx, CLI, and even PHP 5.4's built-in webserver. It's WAY easier than all the other ways you know of to set environment variables, and you're going to love it.. NO editing virtual hosts in Apache or Nginx. NO adding php_value flags to .htaccess files. EASY portability and sharing of required ENV values. COMPATIBLE with PHP's built-in web server and CLI runner

 

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.