• Stars
    star
    275
  • Rank 149,796 (Top 3 %)
  • Language
    PHP
  • License
    MIT License
  • Created almost 11 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

dotenv file loader for PHP

Build Status Coverage Status Total Downloads Latest Stable Version

PHP Dotenv

A .env file parsing and loading library for PHP.

Requirements

  • PHP 5.5+

Installation

[Using Composer]

Run composer require josegonzalez/dotenv:

Or add the plugin to your project's composer.json - something like this:

  {
    "require": {
      "josegonzalez/dotenv": "3.3.0"
    }
  }

Usage

Create a new loader:

<?php
$Loader = new josegonzalez\Dotenv\Loader('path/to/.env');
// Parse the .env file
$Loader->parse();
// Send the parsed .env file to the $_ENV variable
$Loader->toEnv();
?>

Most methods return the loader directly, so the following is also possible:

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->toEnv(); // Throws LogicException if ->parse() is not called first
?>

You can use a .env file with any of the following features:

# comments are allowed
FOO=bar # you can also have comments on the end of a line
export BAR=baz # you can optionally begin with an `export` statement

# both single and double quotes are allowed
BAZ='qux'
QUX="quux"

# as are escaped quotes or similar:
QUUX="corge \" grault"
CORGE='garply" waldo'

# unquoted values containing [null, true, false] are turned into
# their PHP equivalents
PHP_NULL=null
PHP_TRUE=true
PHP_FALSE=false

# when quoted, they are simply string values
STRING_NULL="null"
STRING_TRUE="true"
STRING_FALSE="false"

# spaces are allowed as well
# in a slightly more relaxed form from bash
 GRAULT =fred
GARPLY = plugh
SPACES=" quote values with spaces" # will contain preceding space

# When using newlines, you should use quoted values
QUOTED_NEWLINE="newline\\nchar"

# you can even have nested variables using `${VAR}` syntax
# remember to define the nested var *before* using it
WALDO=${xyzzy} # not yet defined, so will result in WALDO = `{}`
THUD=${GARPLY} # will be defined as `plugh`

# note that variables beginning with a character
# other than [a-zA-Z_] shall throw a ParseException
01SKIPPED=skipped

# However, numbers *are* allowed elsewhere in the key
NOT_SKIPPED1=not skipped # will have the value `not`

Example .env files are available in the fixtures directory.

Defining Constants

You can also define constants automatically from your env file:

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->define(); // Throws LogicException if ->parse() is not called first
?>

Already defined constants will result in an immediate LogicException.

Adding to $_ENV

<?php
$overwriteENV = true;
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->toEnv($overwriteENV); // Throws LogicException if ->parse() is not called first
?>

Already defined $_ENV entries will result in an immediate LogicException, unless $overwriteENV is set to true (default false).

Adding to $_SERVER

<?php
$overwriteSERVER = true;
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->toServer($overwriteSERVER); // Throws LogicException if ->parse() is not called first
?>

Already defined $_SERVER entries will result in an immediate LogicException, unless $overwriteSERVER is set to true (default false).

Making available to apache_getenv()

This should be preferred over getenv when using the Apache web server with mod_php.

<?php
$overwrite = true;
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->apacheSetenv($overwriteAPACHE); // Throws LogicException if ->parse() is not called first
                                                // May throw a PHP Error if either apache_setenv() or apache_putenv() are not available
?>

Already defined apache_getenv() entries will result in an immediate LogicException, unless $overwriteAPACHE is set to true (default false).

Making available to getenv()

<?php
$overwrite = true;
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->putenv($overwriteENV); // Throws LogicException if ->parse() is not called first
?>

Already defined getenv() entries will result in an immediate LogicException, unless $overwriteENV is set to true (default false).

Setting key prefixes

<?php
$environment = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->prefix('FOO')
              ->toServer(); // BAR=baz becomes FOOBAR=baz
?>

Return as array

<?php
$environment = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->toArray(); // Throws LogicException if ->parse() is not called first
?>

Return as json

<?php
$jsonEnvironment = (string)((new josegonzalez\Dotenv\Loader('path/to/.env'))->parse());
?>

Require environment variables

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->expect('FOO', 'BAR', 'BAZ'); // Throws RuntimeException if variables are missing
?>

Turning off exceptions

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->raiseExceptions(false)
              ->parse()
              ->expect('FOO', 'BAR', 'BAZ'); // Returns false if variables are missing
?>

Skip existing environment variables

It is possible to skip existing enviroment variables (e.g. in a containerized / Docker setup).

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->parse()
              ->skipExisting() //Skip any environment variables that are already present
              ->putenv();
?>

Filtering environments

It is possible to optionally filter the environment data produced by php-dotenv through the use of filter classes. A filter class has an __invoke method like so:

<?php
class LollipopFilter
{
    /**
     * Sets every key's value to the string `lollipop`
     *
     * @param array $environment Array of environment data
     * @param array $config Array of configuration data that includes the callable
     * @return array
     */
    public function __invoke(array $environment, array $config)
    {
        $newEnvironment = [];
        foreach ($environment as $key => $value) {
            $newEnvironment[$key] = 'lollipop';
        }
        return $newEnvironment;
    }
}
?>

You can attach filters using the setFilters() method, which will override all currently specified filters. If an invalid filter is specified, a LogicException will be thrown.

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->setFilters(['LollipopFilter']); // Takes an array of namespaced class names
?>

Note that you can optionally set configuration for your filters. These are passed to the __invoke method as the second argument.:

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->setFilters([
                'LollipopFilter' => ['paintshop'],
              ]); // Takes an array of namespaced class names
?>

Filters can also be callables functions, which is useful in one-off situations. They are wrapped by the special CallableFilter.

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->setFilters([function ($data) {
                return $data;
              }]);
?>

If you need special configuration for your callable filters, you can prefix your callable with __callable__N, where N is the integer index the callable is in your array. The callable itself should be contained in a callable config key, as follows:

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->setFilters([
                '__callable__0' => [
                  'callable' => function ($data, $config) {
                    return $data;
                  },
                  'someKey' => 'value',
                ]
              ]);
?>

Finally, to invoke a filter, you must call filter() after calling parse().

<?php
$Loader = (new josegonzalez\Dotenv\Loader('path/to/.env'))
              ->setFilters(['LollipopFilter'])
              ->parse()
              ->filter();
?>

Available Filters

The following filters are built into php-dotenv.

  • josegonzalez\Dotenv\Filter\CallableFilter: Wraps a callable and invokes it upon the environment.
  • josegonzalez\Dotenv\Filter\LowercaseKeyFilter: Lowercases all the keys for an environment to a single-depth.
  • josegonzalez\Dotenv\Filter\NullFilter: Returns the environment data without any changes.
  • josegonzalez\Dotenv\Filter\RemapKeysFilter: Remaps specific keys in a $config array to a set of values at a single-depth.
  • josegonzalez\Dotenv\Filter\UnderscoreArrayFilter: Expands a flat array to a nested array. For example, ['0_Foo_Bar' => 'Far'] becomes [['Foo' => ['Bar' => 'Far']]].
  • josegonzalez\Dotenv\Filter\UppercaseFirstKeyFilter: Uppercases the first letter for all the keys for an environment to a single-depth..
  • josegonzalez\Dotenv\Filter\UrlParseFilter: When there is a key with the suffix _URL, this filter uses parse_url to add extra data to the environment.

Static Environment Definition

You can also call it via the static load method call, which takes an array of arguments. If a method name is specified, the method is called with the value in the $options array being sent into the method.

<?php
josegonzalez\Dotenv\Loader::load(array(
  'filepath' => 'path/to/.env',
  'expect' => array('FOO', 'BAR', 'BAZ'),
  'toEnv' => true,
  'toServer' => true,
  'define' => true,
));
?>

Validating External Environments

In some cases it may be necessary to validate that a given array of environment data matches your requirements. You can use the Loader->expect() functionality via the standalone Expect class:

<?php
use josegonzalez\Dotenv\Expect;

$expect = new Expect($env);
$expect('FOO'); // Raises a RuntimeException if `env` is missing FOO

// You can turn off exception raising using the second `raise` argument
$expect = new Expect($env, false);
$expect('FOO'); // Returns false if `env` is missing FOO
?>

What is it and why should I use it?

When developing and deploying your applications you are typically interacting with various environments - production and development for instance. These environments both execute your code, but will do so using different credentials. You may also wish to distribute your application to developers without accidentally giving them access to important external services.

Simple examples include authentication keys to your email provider or database connection credentials. You would never want to accidentally send testing emails to all your users, or run a DROP TABLE statement against production because you ran your unit tests.

How do you tackle these differing credentials? The php-dotenv helps solve this issue by allowing you to configure your environments in a universal fashion, making it easy to safely switch between environments, as well as share those environments with multiple projects/languages.

Need more reasons? Check out the twelve-factor app docs on configuration.

Rules to follow

When using php-dotenv, you should strive to follow the following rules:

  • Add your .env file to a gitignore and use a .env.default or .env.example to set defaults for your projects. This allows your development team to override defaults in a method that works for their local environment.

  • Always set sane development defaults for any credential. If necessary, disable features when those credentials are "invalid".

  • Where necessary, add comments to credentials with information as to what they are, how they are used, and how one might procure new ones.

  • As php-dotenv uses more lax procedures for defining environment variables, ensure your .env files are compatible with your shell. A good way to test this is to run the following:

    # source in your .env file
    source .env
    # check the environment
    env
  • Avoid running php-dotenv in production settings, and instead set environment variables in your webserver, process manager, or in bash before running your commands. A simple way to ensure this is to check for the existence of a sentinel environment variable that is only set in production:

    // APP_NAME isn't set in staging/dev
    if (!env('APP_NAME')) {
        $loader = new josegonzalez\Dotenv\Loader([
            __DIR__ '/.env',
            __DIR__ '/.env.default'
        ]);
        $loader->parse()->toEnv();
    }

General Security Information

If you configure php-dotenv to output configuration in any of the ways listed above and then dump them, they may be available to undesired users. For instance, using a project like filp/whoops in conjunction with $Loader->toServer() can result in outputting sensitive data to your users if you leave whoops enabled in production.

For this reason, php-dotenv never populates data to an environment variable by default and requires that the developer make a conscious decision about how they want to use loaded environment variables

Many error reporting tools have the option of whitelisting or blacklisting sensitive data, and you should familiarize yourself with said tooling.

License

The MIT License (MIT)

Copyright (c) 2013 Jose Diaz-Gonzalez

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

More Repositories

1

python-github-backup

backup a github user or organization
Python
1,140
star
2

awesome-consul

A list of awesome consul projects, libraries
275
star
3

php-git

Unmaintained: A simple git-php project that enables github-like functionality with a not-so-bad stylesheet :)
PHP
160
star
4

php-queuesadilla

PHP job/worker system built to support various queuing systems
PHP
95
star
5

real-aws-status

Make the aws status page a bit more useful during outages
JavaScript
85
star
6

cakephp-elastic-search-datasource

UNMAINTAINED - CakePHP2: ElasticSearch datasource that actually behaves like a real datasource
PHP
84
star
7

cakephp-admin

CakePHP2: Deprecated in favor of https://github.com/FriendsOfCake/crud
PHP
76
star
8

cakephp-wysiwyg

CakePHP2: Unmaintained helper for various wysiwyg editors
PHP
65
star
9

cakephp-version

CakePHP3: plugin that facilitates versioned database entities
PHP
52
star
10

cakephp-filter

Deprecated
PHP
51
star
11

cakephp-environments

Deprecated CakePHP3: Environments Library as a plugin
PHP
46
star
12

python-slack-tunes

send slack away music notifications from itunes or spotify
Python
45
star
13

metricsd

golang metrics collecting agent for linux
Go
43
star
14

cakephp-webservice

CakePHP2: Takes the data you set and automatically serves it as JSON and XML
PHP
38
star
15

cakephp-purifiable

CakePHP2: Unmaintained plugin that makes your model data so fresh so clean
PHP
37
star
16

cakephp-cake-djjob

CakePHP2: unmaintained plugin that integrates seatgeek's djjob with CakePHP shells
PHP
36
star
17

cakephp-queuesadilla

CakePHP3: easily run background jobs on various message backends
PHP
34
star
18

cakephp-sanction

CakePHP2: give sanction to your users when they intend to navigate to certain portions of your website
PHP
33
star
19

php-error-handlers

Wrappers for popular error handling services
PHP
30
star
20

python-scrapilicious

Unmaintained: A horridly implemented scrapy app that will scrape all (?) of Delicious' bookmarks.
Python
28
star
21

ruby-redis-backup

Unmaintained: a small ruby gem that allows automated redis-backups
Ruby
26
star
22

cakephp-github-plugin-plugin

Deprecated
23
star
23

cakephp-annotation-control-list

CakePHP3: ACL system using controller action annotations
PHP
21
star
24

ruby-cimino

Deprecated: Jekyll blogging at it's finest. No really, even finer than Octopress ;)
CSS
21
star
25

dokku-global-cert

allows setting a global certificate for applications
Shell
20
star
26

cakephp-page-route

CakePHP2: Automagically route /:page style routes without any fuss
PHP
19
star
27

cakephp-trackable

CakePHP2: Unmaintained plugin for tracking who created/modified a record
PHP
17
star
28

sublimetext-cakephp

Native Sublime Text 2 CakePHP Package
15
star
29

cakephp-sham

CakePHP2: Unmaintained plugin that handles SEO-related information
PHP
15
star
30

cakephp-app-skellington

Deprecated: builds a barebones app skeleton based on the db config
PHP
15
star
31

cakephp-documentation

Deprecated: An incomplete re-implementation of the CakePHP documentation as a series of tutorials. CakePHP 1.3 ONLY. Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
15
star
32

cakephp-gzip

CakePHP2: Unmaintained component that auto-gzips html output
PHP
14
star
33

cakephp-calendar-helper

Deprecated: helper that can turn a list of events into a nice, tableized calendar
PHP
13
star
34

python-gitlab-backup

backup a gitlab user or organization
Python
13
star
35

cakephp-simple-scope

CakePHP2: Deprecated behavior that adds a simple interface for scoping finds
PHP
13
star
36

cakephp-dynamic-route

CakePHP2: database-backed dynamic routes
PHP
12
star
37

cakephp-mail-preview

Deprecated CakePHP3: preview emails during development
PHP
12
star
38

cakephp-sitemap

Deprecated: a simple helper that will help you build xml sitemaps and sitemap indexes
PHP
12
star
39

go-brew-manage

Tool for managing a homebrew installation
Makefile
11
star
40

cakephp-log

CakePHP2: logable behavior packaged as a standalone plugin
PHP
11
star
41

cakephp-supervalidatable

Deprecated: packaging delicious validation rules into one behavior :)
PHP
11
star
42

cakephp-twilio

Deprecated: Twilio datasource with support for the major Model methods
PHP
10
star
43

cakeadvent-2016

A repository holding all the code for CakeAdvent 2016
PHP
10
star
44

chef-solo-cup

python wrapper around chef-solo, for managing AWS instances
Python
10
star
45

cakephp-bookmark

CakePHP2: Unmaintained helper that creates links to popular bookmarking web-applications
PHP
9
star
46

chef-cookbooks

A set of generic cookbooks for chef
Ruby
9
star
47

cakephp-blueprint-helper

Deprecated: blueprintcss helper that facilitates some of the oft-repeated parts of the framework
PHP
7
star
48

sshd-config

A tool for manipulating an sshd_config file
Go
7
star
49

cakephp-settings

CakePHP2: a simple plugin to track application settings
PHP
7
star
50

app

CakePHP3: a composer project skeleton for the FUTURE
PHP
7
star
51

cakephp-keyvalue

CakePHP2: Model behavior built that allows you easily store flexible data sets by using a key/value type system.
PHP
7
star
52

cli-skeleton

An opinionated framework for building golang cli tools on top of mitchellh/cli.
Go
6
star
53

ssh-github

An ssh server with support for ssh via a github user's keys
Go
6
star
54

cakephp-fractal-entities

CakePHP3: A thin wrapper around the CakePHP View layer to bring in League\Fractal support
PHP
6
star
55

recorded-ssh

github-backed ssh authentication with automatic session recording
Python
5
star
56

cakephp-stylish-errors

Deprecated: Creates Rails-style error messages in your view (with session messages included!). Just add "echo $errors_for_layout;"
PHP
5
star
57

cakephp-package-installer

Deprecated: Install packages (plugins, applications, utilities) using this plugin
5
star
58

bash-filedb

A command line tool for manipulating a simple, flat-file database.
Shell
5
star
59

php-elastic-adium

a project aimed at allowing me to search my adium chatlogs outside of adium
PHP
5
star
60

dokku-procfile-picker

allows you to specify a procfile to use for an app deployed on dokku
Shell
5
star
61

media-manager

an opensource asset management tool built in CakePHP
PHP
4
star
62

cakephp-deleted-at

CakePHP2: Unmaintained plugin that handles soft-deletion of database records
PHP
4
star
63

cakephp-trimmable

Deprecated: behavior that creates a shorturl for the current record
PHP
4
star
64

tutorial-blog

The 3.0 blog tutorial
PHP
3
star
65

tutorial-autocomplete

jquery autocomplete tutorial for 1.3
PHP
3
star
66

service-skeleton

An opinionated framework for building golang web services
Go
3
star
67

cakephp-database-logger

Deprecated: log anything to the database
PHP
3
star
68

python-aws-hostname

Outputs a valid hostname for a given AWS instance
Python
3
star
69

rad-cakephp-2

Issue Tracker for the "Rapid Application Development with CakePHP 2" BOOK
3
star
70

cakephp-retranslatable

Deprecated: Stop worrying about populating your translation data AFTER you have your app built and database populated
PHP
3
star
71

bash-hipchat

Send hipchat notifications from the command line
Shell
3
star
72

cakephp-ajax-controller

CakePHP2: Deprecated parent controller class that adds a helper _respond() method for ajax requests
PHP
3
star
73

dokku-compose-app

Python
3
star
74

docker-python-tutorial

Python
2
star
75

java-todo-list

J2ME TodoList app for phones with CLDC-1.1 configuration and MIDP-2.1 profile
Java
2
star
76

rds-reservation-analyzer

performs naive analysis on average rds resource utilization to inform reservation decisions
Python
2
star
77

josegonzalez.github.io

My Website, made of Jekyll
HTML
2
star
78

site-humanslol

or rofl, i guess
2
star
79

cakephp-inflection-shell

Deprecated: Inflect the heck out of your word(s)
2
star
80

cakephp-serializable

Deprecated: Store serializable data within relational databases in a snap
PHP
2
star
81

python-command-notifier

A very simple command-notification package based on SQS for distributed systems
Python
1
star
82

doc-theme

A doc theme
CSS
1
star
83

site-didmarkbreakthebuild.com

1
star
84

go-avahi-register

A tool for registering services against avahi/bonjour
Go
1
star
85

cakephp-users

A simple wrapper for various projects to make crud and user management a breeze
PHP
1
star
86

ruby-mendeleev

a periodic table of elements
Ruby
1
star
87

josediazgonzalez.com

The jekyll-backed source code for my blog
HTML
1
star
88

python-dns-api

A simple service for managing a dnsimple account.
Python
1
star
89

cakephp-codebasehq

Deprecated: Shell than can calculate CodeBaseHQ time using git commit messages
1
star
90

python-smooshy

Deprecated: Python binary to losslessly compress images using smush.it
Python
1
star
91

chefsen

chef based os x management system
Ruby
1
star
92

go-xunit-reader

A tool for reading xunit xml output files
Makefile
1
star
93

docker-travis-php

python-based .travis.yml parser that poops out a simple dockerfile for php projects
Python
1
star
94

sm

Simple secret management tool for server configuration
Go
1
star