5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

laravelので, 環境変数の扱い

Posted at

確認環境

php 5.4
laravel 5.0

laravelでの環境変数ファイルの扱い

環境依存の変数をファイルにまとめておき, 実行時に適切なファイルを読み込むことで
環境間の違いを吸収する仕組みは, 実現方法の違いこそあれ, 大抵のフレームワークについているものです.
しかし, laravelでは何らかの方法で現在の環境を判断して自動で環境変数ファイルを読み分けるような方法は採用しておらず,
常にアプリケーション直下の.envのみを環境変数ファイル読み込むようになっています.
ですので, 環境変数ファイルの切り替えをしたい場合は, 予め環境ごとのファイルを用意しておき, デプロイ時に
スクリプトで(あるいは手動で)シンボリックリンクを貼ってやる必要があります.

なぜ, 他のフレームワークではよくある自動で行っている環境変数ファイルの読み込みを採用しなかったかはわかりません.
多機能であることより, シンプルさや直感的なわかりやすさを優先したのでしょうか?
(実際, Symphonyの設定ファイルとは多機能ではあるのですが, なかなか煩雑なものだった覚えが...)

環境変数の使用方法

.envファイルで定義した環境変数を使用したいときは, env関数を使います.

config/app.php
  ...
  'host' =>  env('DB_HOST', 'localhost')
  ...

第二引数は, 指定した変数が定義されていなかった時に返されるデフォルト値です.

単体テスト時の環境変数

単体テスト時は, 単体テスト用の環境変数が使いたくなると思います(接続先DBとか)
複数の環境変数ファイルを使う仕組みの場合, 単体テスト用のファイルを作ってそちらを読みこむようになっているものですが,
laravelではそういったファイルを使う代わりに, phpunitの設定ファイルである'phpunit.xml'ファイルに直接環境変数を定義するよう方法を採用しています.

phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
            <exclude>./tests/ExampleTest.php</exclude>
        </testsuite>
    </testsuites>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="APP_LOG_LEVEL" value="debug"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="DB_HOST" value="root"/>
        <env name="DB_USERNAME" value="root"/>
        <env name="DB_PASSWORD" value="hogehoge"/>
        <env name="DB_DATABASE" value="my_test"/>
    </php>
</phpunit>

これで, この設定ファイルを使って単体テストを行えば, my_testデータベースにアクセスするようになります.
この辺, ちょっと統一感がない気もしますが, まあ文句を言ってもしょうがないですね.

テスト時にphpunit.xmlで設定した値が使用されない時は...

こういった現象が一度起きて難儀したのですが, 結論から言うと, configのcacheファイルが作成されている場合
単体テスト時もそちらを使用するようになってしまうようです.
なので, 開発環境ではキャッシュを作らないほうがいいようです(当たり前ですが)
ちなみに, 生成されるキャッシュファイルの場所ですが, 調べるとstorage/framework/cache以下に生成されるという情報が多いのですが, 私の開発環境ではvendor/直下に作成されていました.
(なので, キャッシュ作成がうまく行っていないかと思っていた…)
これはlaravelのバージョンによるのでしょうか?

参考

Laravel 設定 : https://readouble.com/laravel/5/0/dev/ja/configuration.html
[Laravel]デプロイ時の最適化 : http://qiita.com/qiita-kurara/items/d37dbc5b67e6b6dfbe1d

5
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?