Drop in replacement for vlucas/phpdotenv
, but ensures that all necessary environment
variables are defined after reading from .env. These needed variables are read from .env.example
, which should be
committed along with your project.
This is heavily inspired by dotenv-safe.
composer require morrislaptop/phpdotenv-safe
# .env.example, committed to repo
SECRET=
TOKEN=
KEY=
# .env, private
SECRET=topsecret
TOKEN=
$dotenv = new DotenvSafe\DotenvSafe(__DIR__);
$dotenv->load();
Since the provided .env
file does not contain all the variables defined in .env.example
, an exception is thrown:
PHP Fatal error: Uncaught Dotenv\Exception\ValidationException: One or more environment variables failed assertions: KEY is missing.
Not all the variables have to be defined in .env
, they can be supplied externally. For example, the following would work:
KEY=xyz php index.php
Laravel doesn't make it easy to swap out its existing Dotenv
instance from vlucas/phpdotenv
, but you can validate the environment manually with DotenvSafe
when the application boots.
Just add the following to your AppServiceProvider->register
method (which you'll find in app/providers/AppServiceProvider.php
):
if (!$this->app->configurationIsCached()) {
$dotenv = new DotenvSafe\DotenvSafe($this->app->environmentPath(), $this->app->environmentFile());
$dotenv->check();
}
bootstrap/app.php
runs when your application starts, and loads the environment using Dotenv\Dotenv
. You can easily swap this out to use DotenvSafe\DotenvSafe
. All you need to do is replace:
(new Dotenv\Dotenv(__DIR__.'/../'))->load();
with:
(new DotenvSafe\DotenvSafe(__DIR__.'/../'))->load();