What is difference between use env('APP_ENV')
, config('app.env')
or App::environment()
to get app environment?
I know that the env('APP_ENV')
will to $_ENV
, config('app.env')
reads the configuration and App::environment()
is an abstraction of all. And in my opinion the advantage is even this. Abstraction.
I do not know if there are other differences, such as the level of performance or security
In Short & up-to-date 2020:
use env()
only in config files
use App::environment()
for checking the environment (APP_ENV in .env).
use config('app.var')
for all other env variables, ex: config('app.debug')
create own config files for your own ENV variables. Example:
In your .env:
MY_VALUE=foo
example config app/myconfig.php
return [
'myvalue' => env('MY_VALUE', 'bar'), // 'bar' is default if MY_VALUE is missing in .env
];
Access in your code:
config('myconfig.myvalue') // will result in 'foo'
Explanation & History:
I just felt over it. When you cache your config file, env()
will (sometimes?) not work right. So what I found out:
env()
within the config files. Use the config()
helper in your code instead of env()
. For example you can call config('app.env')
in your code.php artisan config:cache
all the configuration strings are cached by the framework and any changes you make to your .env
file will not be active until you run the php artisan config:cache
command again.From this article on Laracast:
UPDATE:
env()
calls work as long as you don't use php artisan config:cache
. So it's very dangerous because it will often work while development but will fail on production. See upgrade guide
Caching And Env
If you are using the config:cache command during deployment, you must make sure that you are only calling the env function from within your configuration files, and not from anywhere else in your application.
If you are calling env from within your application, it is strongly recommended you add proper configuration values to your configuration files and call env from that location instead, allowing you to convert your env calls to config calls.
UPDATE Laravel 5.6:
Laravel now recommends in its documentation to use
$environment = App::environment();
// or check on an array of environments:
if (App::environment(['local', 'staging'])) {
// The environment is either local OR staging...
}
and describes that env()
is just to retrieve values from .env
in config files, like config('app.env')
or config('app.debug')
.