2017-08-25 22 views
8

Symfony Flex kullanarak yeni bir Symfony yüklemesi yaptım ve yeni iskelet sonraki Symfony 4 dizin yapısına ait.Symfony4 yapısındaki ortam değişkenlerimi parametre dosyasında nasıl geri alabilirim?

İlk üçüncü taraf paketini ekleyip yapıyorum: HWIOAuthBundle. Bu paket, iki gizli bilgi kullanarak Twitter üzerinden bağlanmak için kullanılır.

ve consumer_secret adreslerimi config/packages/hwi_oauth.yaml dosyasında bildiriyorum.

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

Uygulamam düzgün çalışıyor. Ama sırlarımı github'a işleyemem!

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

Yeni DotEnv paketi hakkında Symfony4 best practices okuyun:

Ben böyle bir hwi_oauth.yaml dosya istiyorum. en iyi uygulamalar da önerildiği gibi

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).

, bu iki çizgi .env dosyayı ekleyin:

TWITTER_CONSUMER_ID=XXXXXMyIdXXXXX 
TWITTER_CONSUMER_SECRET=XXXXXMyTopSecretKeyXXXXX 

Ama bu hatayla karşılaştı:

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

Ben %kernel.twitter_consumer_id% ile çalıştı, %env.twitter_consumer_id%, %env(TWITTER_CONSUMER_ID)% daha fazla başarı ile.

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

nasıl hwi_oauth.yaml gibi bir parametre dosyasında benim ENV değişkenleri alabilirsiniz:

son testi bu hata mesajını dönüyor?

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

Sen evreleme, gelişimi üzerine ortam değişkenleri gizli anahtarlarını koymak planlamalısınız ve:

+1

Eğer 'DotEnv' bileşeni ile' .env' yükleme var mı? – bishop

+0

Teşekkürler @bishop! 'Public \ index.php', 'if (! Getenv (' APP_ENV ')) {(yeni Dotenv()) -> load (__ DIR __.'/.. /. Env '); } 've bu' .env' yüklenmedi. Şuan çalışıyor ! Fakat kontrol, üretimde '.env' kullanılmamasını sağlamaktır. Bunu nasıl kullanacağımı anlamıyorum ve hala ürünümüzü koruyorum ... '' getenv '' ('APP_ENV') 'i bu testin yerine getirmesi güvence altına alındı: 'in_array (getenv (' APP_ENV '), [ 'dev', 'test']) '? –

cevap

6

KULLANMAK için bu ortam değişkenleri için sırayla, sizin önyükleme işlemi sırasında .env dosyasını yüklemek gerekir üretim. Bunun nasıl yapıldığına bağlı. Geliştirme ve hazırlık aşamasında, belki de .env dosyalarını kullanırsınız, üretim sırasında ise Apache'yi enjekte etmek için kullanırsınız.

Şahsen her zaman .env dosyalarını kullanırım ve depoda boş bir tane tutar. Bu şekilde dağıtımı son derece basit ve özel durumlar yok. Eğer sadece belirli ortamlarda .env dosyaları kullanmak istiyorsanız

, yapabileceğiniz:

testler: Ben de öneririm test ortamlar için

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

Çok teşekkürler @bishop! –

+2

+1 'getenv ('APP_ENV')', yerel cihazınızda 'APP_ENV' env var' ayarlamayı gerektirse de. Varsayılanı da eklemeyi öneririm, eğer (! Getenv ('APP_ENV') || ...) '. – yceruto

+0

Gerçekten, @yceruto. Ortam değişkenlerini yüklemek için bir ortam değişkeni ayarlamak zorunda. O_o Kayıtsız şartsız env dosyalarını kullanmamın bir kısmı. – bishop

4

.env parametrelerini geçersiz kılmak için bir bootstrap.php komut dosyası oluşturmak/önyükleme.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

Çok iyi çalışıyor! Çok teşekkürler! –

İlgili konular