2017-08-25 80 views
8

私はSymfony Flexを使って新鮮なSymfonyインストールを行い、新しいスケルトンは次のSymfony 4ディレクトリ構造に属します。Symfony4構造のパラメータファイルで自分の環境変数を取得するにはどうしたらいいですか?

私はサードパーティ製の最初のバンドルを追加して設定します:HWIOAuthBundle。このバンドルは、2つの秘密情報を使用してTwitter経由で接続するために使用されます。

consumer_secretconfig/packages/hwi_oauth.yamlファイルに宣言します。

hwi_oauth: 
    firewall_names: [secured_area] 
    resource_owners: 
     twitter: 
      type:   twitter 
      client_id:  XXXXXMyIdXXXXX 
      client_secret: XXXXXMyTopSecretKeyXXXXX 

私のアプリケーションはうまくいきます。しかし、私はギターに自分の秘密をコミットすることはできません!私は新しいDotEnvパッケージについてSymfony4 best practicesを読ん

hwi_oauth: 
    firewall_names: [secured_area] 
    resource_owners: 
     twitter: 
      type:   twitter 
      client_id:  '%twitter_consumer_id%' 
      client_secret: '%twitter_consumer_secret%' 

は、私はこの1つのようなhwi_oauth.yamlファイルを持っていると思います。

Using environment variables, while far from being perfect, have many benefits over what we currently do. Environment variables are a more "standard" way of managing settings that depend on the environment (no need to manage a parameters.yml.dist for instance).

のベストプラクティスで示唆したように、私は.envファイルにこれらの2行を追加します。

TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX 
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX 

しかし、私はこのエラーが発生しました:

You have requested a non-existent parameter "twitter_consumer_id".

私は%kernel.twitter_consumer_id%%env.twitter_consumer_id%%env(TWITTER_CONSUMER_ID)%で試してみましたこれ以上成功することはありません。

An exception has been thrown during the rendering of a template ("Environment variable not found: "TWITTER_CONSUMER_ID".").

がどのように私はhwi_oauth.yamlなどのパラメータ・ファイルに私のENV変数を取得することができます。

最後のテストでは、このエラーメッセージを返すのですか?

+1

あなたは 'DotEnv'コンポーネントで' .env'をロードしていますか? – bishop

+0

ありがとう@bishop! 'public \ index.php'は' if(!getenv( 'APP_ENV')){(新しいDotenv()) - > load(__ DIR __。 '/ .. /。env')を含みます。 } 'この' .env'はロードされませんでした。それは今働きます!しかし、このチェックは生産に '.env'を使わないようにすることです。私はdevでそれを使用する方法を理解していないし、私のprodを保護する...これは、 'getenv( 'APP_ENV')' in_array(getenv( 'APP_ENV')、 'dev'、 'test']) '? –

答えて

6

あなたはこれらの環境変数が利用できるようにするためには、ブートストラッププロセス中に.envファイルをロードする必要があります:ステージング、あなたが開発に環境変数で秘密鍵を置くことを計画してください

(new DotEnv())->load(__DIR__ . '/../.env'); 

、および製造。 どうやってそれをするのですか?開発とステージングでは、おそらく.envファイルを使用しますが、実稼働環境ではApacheを使用して注入します。

個人的には、私は常に.envファイルを使用し、私は自分のリポジトリに空白を残しています。そうすることで、配備が非常に簡単で、特別なケースはありません。あなたが唯一の特定の環境で.envファイルを使用する場合は

、あなたが行うことができます:

テスト:私もお勧めしたいtest環境で

if (in_array(getenv('APP_ENV'), [ 'dev', 'test' ])) { 
    (new DotEnv())->load(__DIR__ . '/../.env'); 
} 
+1

ありがとう@ビショップ! –

+2

+1 'getenv( 'APP_ENV')はあなたのローカルのマシンで' APP_ENV' env varを設定する必要があります。私はデフォルトのものも 'if(!getenv( 'APP_ENV')|| ...)'に追加することをお勧めします。 – yceruto

+0

実際、@yceruto。環境変数をロードするために環境変数を設定する必要があります。 O_o私が無条件でenvファイルを使う理由の一部。 – bishop

4

.envパラメータをオーバーライドするbootstrap.phpスクリプトを作成します/ブートストラップPHP:

<?php 

use Symfony\Component\Dotenv\Dotenv; 

require_once __DIR__.'/../vendor/autoload.php'; 

$dotEnv = new Dotenv(); 
$dotEnv->load(__DIR__.'/../.env'); 
$dotEnv->populate([ 
    'APP_ENV' => 'test', 
    'DATABASE_URL' => '...' 
    // ... 
]); 

phpunit.xml.dist:

<?xml version="1.0" encoding="UTF-8"?> 

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" 
     bootstrap="tests/bootstrap.php" <--- set 
     ... 
> 
    ... 
</phpunit> 
+0

それはあまりにもうまく動作します!どうもありがとう! –

関連する問題