dotenv: Environmental Variables
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeThe $debug
and $environment
variables are hardcoded in index.php
. So if we deploy this, we'll either have a web debug toolbar on production, or we'll need to manually modify this file to set $debug
to false. Both situations stink.
PHP dotenv Fanciness
To help, we'll install a new library: composer require vlucas/phpdotenv
:
composer require vlucas/phpdotenv
While we're waiting, Google for that library and find its documentation.
This is a popular library these days, and I really like it too. It allows you to have a .env
file at the root of your project. It'll look something like this:
S3_BUCKET="dotenv"
SECRET_KEY="souper_seekret_key"
This library reads these values and turns S3_BUCKET
and SECRET_KEY
into environment variables. Then, in our app, whenever we need some configuration - like whether we're in debug mode, the database password or the S3 bucket - we'll read from the environment variables. When you eventually deploy, you can set those variables in two different ways. First, you can have a .env
file. Or second, you can set the variables via something like your web server configuration. Some platforms - like Heroku also have a way to set environment variables. The important point is that your app isn't bound to a configuration file: it's just reading environment variables, which is a pretty standard way of setting config.
Our .env File
The first things we want to set are the $env
and $debug
flags. Create a .env
file and say SYMFONY_ENV=dev
and SYMFONY_DEBUG=1
:
# basic setup | |
SYMFONY_ENV=dev | |
SYMFONY_DEBUG=1 |
Remove the old variables in index.php
. Replace it with $dotenv = new DotEnv\DotEnv()
. The argument is the directory where the .env
file lives - it's actually up one directory from here. Then, call $dotenv->load()
:
// ... lines 1 - 9 | |
// load the environmental variables | |
$dotenv = new Dotenv\Dotenv(__DIR__.'/../'); | |
$dotenv->load(); | |
// ... lines 13 - 26 |
At this point, those two flags have been set as environment variables. That means we can say $env = $_SERVER['SYMFONY_ENV'];
and $debug = $_SERVER['SYMFONY_DEBUG'];
:
// ... lines 1 - 9 | |
// load the environmental variables | |
$dotenv = new Dotenv\Dotenv(__DIR__.'/../'); | |
$dotenv->load(); | |
$env = $_SERVER['SYMFONY_ENV']; | |
$debug = $_SERVER['SYMFONY_DEBUG']; | |
// ... lines 15 - 26 |
Go back and refresh the new setup - we should still see the toolbar. Yep, there it is. But now go back to .env
and set SYMFONY_DEBUG
to 0. Because of config.yml
, this should turn the toolbar off. Change the environment to prod
too - that's not being used anywhere yet, but it may avoid a temporary cache error:
# basic setup | |
SYMFONY_ENV=prod | |
SYMFONY_DEBUG=0 |
Try it out: no web debug toolbar.
Add .env
to the .gitignore
file - this shouldn't be committed:
// ... lines 1 - 3 | |
/.env |
But copy .env
to .env.example
- we will commit this so that new developers have something they can use as a guide.
Another useful tool - https://github.com/dotenv-l....
It’s a lightning-fast linter for .env files. Written in Rust.