phpdotenvで環境変数を制御する
phpdotenvとは
phpdotenv(PHP dotenv)は、.env
ファイルに環境変数を記述することで、getenv()
、$_ENV
、$_SERVER
からの環境変数呼び出しを.env
ファイルから取得することができる
Rubyのdotenvライブラリがベース
特徴
- PHPで使う環境変数をDocumentRoot配下でまとめて管理することができる
- Twelve Factor App::設定
- 「Twelve-Factor Appは設定を 環境変数 に格納する」
- Twelve Factor App::設定
- ApacheやnginxなどVirtualHost内で環境変数を設定する必要がなくなる
- 設定済みの環境変数を上書きするかどうか制御が可能(デフォルトは上書き不可)
インストール方法
composerでインストールする
php composer.phar require vlucas/phpdotenv
使い方
基本的な使い方
.env
ファイルとsample.php
を用意する
URL="http://example.com"
<?php require_once './vendor/autoload.php'; // 引数は「.env」ファイルが存在するディレクトリを指定する $dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); echo getenv('URL'); // http://example.com echo $_ENV['URL']; // http://example.com echo $_SERVER['URL']; // http://example.com
環境変数ファイルにコメントを入れる
#
をつけるとコメント扱いになる
一行コメントと行末コメントに対応している
#comment1 URL="http://example.com"#comment2
<?php require_once './vendor/autoload.php'; $dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); echo $_ENV['URL']; // http://example.com
定義した環境変数を変数として扱う
${}
で環境変数を囲うと変数として読み込むことができる
SUBDOMAIN="hoge" URL="http://${SUBDOMAIN}.example.com"
<?php require_once './vendor/autoload.php'; $dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); echo $_ENV['URL']; // http://hoge.example.com
Tips
.env以外のファイルを指定する方法
Dotenv
コンストラクタの第二引数にファイル名を指定すると任意のファイルを呼ぶことができる
URL="http://hoge.example.com"
<?php require_once './vendor/autoload.php'; // 第二引数にファイル名を指定する $dotenv = new Dotenv\Dotenv(__DIR__, 'hoge.env'); $dotenv->load(); echo $_ENV['URL']; // http://hoge.example.com
環境変数の上書き制御について
同一環境変数の場合、デフォルトでは上書きされない
overload
メソッドを呼ぶと上書きされる
.env
と.env2
を用意して、デフォルト(load
)とoverload
それぞれの動きを確認した
.env
の設定内容
SUBDOMAIN="hoge" URL="http://${SUBDOMAIN}.example.com" HOGE=".env"
.env2
の設定内容
SUBDOMAIN="fuge" URL="http://${SUBDOMAIN}.example2.com" FUGE=".env2"
デフォルトの挙動
<?php require_once './vendor/autoload.php'; $dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); $dotenv = new Dotenv\Dotenv(__DIR__, ".env2"); $dotenv->load(); print_r($_ENV); /* Array ( [SUBDOMAIN] => hoge [URL] => http://hoge.example.com [HOGE] => .env [FUGE] => .env2 ) */
HOGE
とFUGE
はそれぞれの環境変数ファイルから読み込まれているが、SUBDOMAIN
とURL
は上書きされていない
overload呼び出しの挙動
同一環境変数を上書きたい場合は、overload
メソッドを呼び出す
<?php require_once './vendor/autoload.php'; $dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); $dotenv = new Dotenv\Dotenv(__DIR__, ".env2"); $dotenv->overload(); print_r($_ENV); /* Array ( [SUBDOMAIN] => fuge [URL] => http://fuge.example2.com [HOGE] => .env [FUGE] => .env2 ) */
HOGE
とFUGE
はそれぞれの環境変数ファイルから読み込まれ、SUBDOMAIN
とURL
は上書きされた
読みこんだ環境変数の型
これらは全てstring型で扱っている
SAMPLE_1="true" SAMPLE_2=true SAMPLE_3="1" SAMPLE_4=1
requiredメソッドについて
phpdotenvにはrequired
メソッドがある
以下の例は、SAMPLE_1
が未定義だった場合に、Dotenv\Exception\ValidationException
がスローされる
<?php require_once './vendor/autoload.php'; $dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load(); $dotenv->required('SAMPLE_1');
required
は配列として引数に指定することができる
// 「SAMPLE_1」「SAMPLE_2」両方の環境変数がセットされていなければ例外スロー
$dotenv->required(['SAMPLE_1', 'SAMPLE_2']);
required
の後にチェーンメソッドをつなげることができる
// SAMPLE_1が数値であればOK $dotenv->required('SAMPLE_1')->isInteger(); // SAMPLE_1が数値かつ100か101であればOK $dotenv->required('SAMPLE_1')->isInteger()->allowedValues([100, 101]);
required
メソッドは環境変数の中身を厳密にチェックしたいときに使えそう