2017-08-25 21 views
8

मैंने सिम्फनी फ्लेक्स का उपयोग करके एक ताजा सिम्फनी इंस्टॉलेशन किया और नया कंकाल अगले सिम्फनी 4 निर्देशिका संरचना से संबंधित है।Symfony4 संरचना में पैरामीटर फ़ाइल में मैं अपने पर्यावरण चर को कैसे पुनर्प्राप्त कर सकता हूं?

मैं पहले तीसरे पक्ष के बंडल को जोड़ और कॉन्फ़िगर करता हूं: HWIOAuthBundle। इस बंडल का उपयोग दो गुप्त सूचनाओं का उपयोग करके ट्विटर के माध्यम से कनेक्ट करने के लिए किया जाता है।

मैं consumer_id और फ़ाइल में consumer_secret घोषित करता हूं।

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

मेरा आवेदन ठीक काम करता है। लेकिन मैं गितूब पर अपने रहस्य नहीं कर सकता!

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

मैं नए DotEnv पैकेज के बारे में Symfony4 best practices पढ़ें:

मैं एक 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 करने के लिए फ़ाइल संलग्न:

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

धन्यवाद @ बिशप! 'Public \ index.php' में' if (! Getenv ('APP_ENV')) {(नया Dotenv()) -> लोड (__ डीआईआर __। '/ .. /। Env') है; } 'और यह' .env' लोड नहीं किया गया था। यह अब काम करता है ! लेकिन चेक यह सुनिश्चित करना है कि हम उत्पादन में '.env' का उपयोग न करें। मैं समझ नहीं पा रहा हूं कि इसे देव में कैसे उपयोग किया जाए और अभी भी मेरे प्रोड की रक्षा करें ... क्या यह परीक्षण '! Getenv (' APP_ENV ')' को पुनः प्राप्त करने के लिए सुरक्षित है: 'in_array (getenv (' APP_ENV '), [ 'देव', 'परीक्षण']) '? –

उत्तर

6

आप उपलब्ध होने की उन वातावरण चर के लिए आपको अपने बूटस्ट्रैप प्रक्रिया के दौरान .env फ़ाइल को लोड करने, की जरूरत है:

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

आप विकास पर वातावरण चर में गुप्त चाबियाँ डाल करने के लिए, के मंचन की योजना बनानी चाहिए, और उत्पादन। हालांकि आप यह कैसे करते हैं, इस पर निर्भर करता है। विकास और स्टेजिंग में, शायद आप .env फ़ाइलों का उपयोग करते हैं, जबकि उत्पादन पर आप अपाचे को इंजेक्ट करने के लिए उपयोग करते हैं।

व्यक्तिगत रूप से, मैं हमेशा .env फ़ाइलों का उपयोग करता हूं, और मैं अपने भंडार में एक खाली स्थान रखता हूं। इस तरह यह तैनाती के लिए बहुत आसान है, और कोई विशेष मामला नहीं है।

आप केवल विशिष्ट वातावरण में .env फ़ाइलों का उपयोग करना चाहते हैं, तो आप कर सकते हैं:

परीक्षण:

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

बहुत बहुत धन्यवाद @ बिशप! –

+2

+1 हालांकि 'getenv ('APP_ENV') को आपके स्थानीय देव मशीन में 'APP_ENV' env var सेट करने की आवश्यकता होगी। मैं सुझाव दूंगा कि डिफ़ॉल्ट भी जोड़ें 'अगर (! Getenv (' APP_ENV ') || ...) '। – yceruto

+0

वास्तव में, @yceruto। पर्यावरण चर को लोड करने के लिए एक पर्यावरण चर सेट करना है। O_o कारणों से मैं बिना शर्त रूप से env फ़ाइलों का उपयोग करता हूं। – bishop

4

test वातावरण के लिए मैं भी सुझाव देंगे .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

यह भी ठीक काम करता है! आपका बहुत बहुत धन्यवाद! –

संबंधित मुद्दे

 संबंधित मुद्दे