2011-12-23 17 views
6

मुझे symfony2 कॉन्फ़िगरेशन अन्य कॉन्फ़िगरेशन-फ़ाइलों से मूल्यों को सही ढंग से ओवरराइट करने के लिए नहीं मिल सकता है। यहां समस्या है:symfony2 yaml: कॉन्फ़िगरेशन ओवरराइट

मेरे पास एक नया वातावरण "स्टेजिंग" है जहां मैं config_prod.yml से अधिकांश सामग्री का उपयोग करना चाहता हूं लेकिन एक और लॉगिंग स्तर है (मैं इसे विकास में होना चाहता हूं, बस सबकुछ लॉगिंग करना चाहता हूं एक फाइल के लिए)। यहाँ कर रहे हैं config सामान मैं का उपयोग करें:

config_prod.yml:

imports: 
    - { resource: config.yml } 

monolog: 
    handlers: 
     main: 
      type: fingers_crossed 
      action_level: error 
      handler: nested 
     nested: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 

config_staging.yml:

imports: 
    - { resource: config_prod.yml } 

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 
     nested: ~ 

देखने की मेरी बात से, नेस्टेड लकड़हारा अब रिक्त है और मुख्य लॉग दिए गए फ़ाइल में। वास्तव में क्या होता है कि वह हर संदेश को दो बार लॉग करता है! एक ही होता है जब मैं config_staging.yml के लिए इस का उपयोग करें:

imports: 
    - { resource: config_prod.yml } 

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 
      handler: ~ 
     nested: ~ 

मैं एक वैकल्पिक हल मिल गया है, डिबग करने के लिए मुख्य हैंडलर के action_level स्थापित करने और किसी और उसी रूप में सब कुछ छोड़ रहा है, लेकिन मैं इस समाधान पसंद नहीं है । कॉन्फ़िगरेशन सामग्री को ओवरराइट करने का एक तरीका होना चाहिए, इसलिए मेरे पास केवल मुख्य मोनोलॉग हैंडलर है।

उत्तर

8

सुंदर ज्यादा एक साल बाद मैं अब की समझ क्या हो रहा है और यह कैसे को रोकने के लिए:

nested हैंडलर config.yml से विन्यास के साथ befilled जाता है और जब config_staging.yml पार्स करने, YAML घटक अधिलेखित नहीं करता है पूरे हैशपैप और मान को शून्य पर सेट करें लेकिन दोनों को मर्ज करने का प्रयास करता है, जिसके परिणामस्वरूप पहले की तरह ही सरणी होती है।

null नामक एक प्रकार है जिसका उपयोग किसी भी लॉगर को ओवरराइट करने के लिए किया जा सकता है। यह कुछ नहीं करता है और है उपयोग के इस मामले की वजह उपयुक्त:

monolog: 
    handlers: 
     main: 
      type: stream 
      path: %kernel.logs_dir%/%kernel.environment%.log 
      level: debug 
      handler: ~ 
     nested: ~ 
      type: null 

एक अन्य समाधान config.yml में लेकिन केवल config_prod.yml और इतने पर की तरह विशिष्ट वातावरण कॉन्फ़िगरेशन में किसी भी प्रवेश कॉन्फ़िगर नहीं होगा।

1

जांचें कि आपके पास _staging कॉन्फ़िगरेशन फ़ाइल में कोई भी दोहराई गई कुंजी नहीं है - दूसरा, नेट परिणाम के साथ पहले को ओवरराइड करेगा, जिसे पहले अनदेखा किया जाएगा।

+0

मैंने इसे चेक किया, वहां कोई गणराज्य कुंजी नहीं है! – Sgoettschkes

0

यदि आप किसी तत्व को हटाकर संग्रह को बदलना चाहते हैं तो आपको संग्रह को "शून्य" करने के लिए एक इंटरमीडिएट वाईएएमएल फ़ाइल (आधार आयात करना) बनाना होगा और बदले में एक फ़ाइल में सभी आवश्यक संग्रह तत्वों को दोबारा जोड़ना होगा मध्यवर्ती वाईएएमएल फ़ाइल आयात करता है।

आप बस संग्रह को ओवरराइट नहीं कर सकते हैं। नए तत्व जोड़े जाएंगे लेकिन आप वर्णित वर्कअराउंड को छोड़कर मौजूदा लोगों को हटा नहीं सकते हैं।