demolog

備忘録. 雑なあまりにも雑な

phpdotenvで環境変数を制御する

phpdotenvとは

phpdotenv(PHP dotenv)は、.envファイルに環境変数を記述することで、getenv()$_ENV$_SERVERからの環境変数呼び出しを.envファイルから取得することができる Rubydotenvライブラリがベース

特徴

インストール方法

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
)
*/

HOGEFUGEはそれぞれの環境変数ファイルから読み込まれているが、SUBDOMAINURLは上書きされていない

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
)
*/

HOGEFUGEはそれぞれの環境変数ファイルから読み込まれ、SUBDOMAINURLは上書きされた

読みこんだ環境変数の型

これらは全て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メソッドは環境変数の中身を厳密にチェックしたいときに使えそう