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