2014-07-10 2 views
7

मेरे पास एक यमल लोडर है जो "प्रोफ़ाइल" के लिए अतिरिक्त कॉन्फ़िगरेशन आइटम लोड करता है (जहां एक एप्लिकेशन अलग-अलग प्रोफाइल का उपयोग कर सकता है, उदाहरण के लिए एक ही साइट के विभिन्न स्थानीय संस्करणों के लिए)। (थोड़ा सरलीकृत भी कैशिंग क्योंकि वहाँ है)सिम्फनी 2 - अपने स्वयं के यामल फ़ाइल लोडर में% पैरामीटर% का विश्लेषण कैसे करें?

# YamlProfileLoader.php 

use Symfony\Component\Config\Loader\FileLoader; 
use Symfony\Component\Yaml\Yaml; 

class YamlProfileLoader extends FileLoader 
{ 
    public function load($resource, $type = null) 
    { 
     $configValues = Yaml::parse($resource); 
     return $configValues; 
    } 

    public function supports($resource, $type = null) 
    { 
     return is_string($resource) && 'yml' === pathinfo(
      $resource, 
      PATHINFO_EXTENSION 
     ); 
    } 
} 

लोडर और अधिक या कम इस तरह प्रयोग किया जाता है:

मेरे लोडर बहुत सरल है

$loaderResolver = new LoaderResolver(array(new YamlProfileLoader($locator))); 
$delegatingLoader = new DelegatingLoader($loaderResolver); 

foreach ($yamlProfileFiles as $yamlProfileFile) { 
    $profileName = basename($yamlProfileFile, '.yml'); 
    $profiles[$profileName] = $delegatingLoader->load($yamlProfileFile); 
} 

तो YAML फ़ाइल है यह पार्स करने है:

# profiles/germany.yml 

locale: de_DE 
hostname: %profiles.germany.host_name% 

फिलहाल, जिसके परिणामस्वरूप सरणी सचमुच शामिल सरणी कुंजी के लिए।

तो, वास्तविक पैरामीटर मान प्राप्त करने के लिए मैं% पैरामीटर को कैसे पार्स कर सकता हूं?

मैं सिम्फनी 2 कोड और दस्तावेज़ (और this SO question) के माध्यम से ट्रैवलिंग कर रहा हूं और यह नहीं पाया जा सकता कि यह फ्रेमवर्क के भीतर ही किया जाता है। मैं शायद अपना खुद का पैरामीटर पार्सर लिख सकता हूं - कर्नेल से पैरामीटर प्राप्त करें, खोज % foo% स्ट्रिंग्स और लुक-अप/प्रतिस्थापित करने के लिए ... लेकिन यदि कोई घटक उपयोग करने के लिए तैयार है, तो मैं इसका उपयोग करना पसंद करता हूं।

थोड़ा और पृष्ठभूमि देने के लिए, मैं इसे क्यों शामिल नहीं कर सकता मुख्य config.yml में: मैं app/config/profiles/*.yml लोड करने में सक्षम होना चाहता हूं, जहां * प्रोफ़ाइल नाम है, और मैं इसे पूरा करने के लिए अपने स्वयं के लोडर का उपयोग कर रहा हूं। अगर वाइल्डकार्ड आयात कॉन्फ़िगरेशन फ़ाइलों का कोई तरीका है, तो यह भी काम कर सकता है मुझे।

नोट: वर्तमान में 2.4 का उपयोग कर रहा है, लेकिन अगर यह मदद करता है तो 2.5 तक अपग्रेड करने के लिए तैयार है।

उत्तर

0

मैंने पैरामीटर.इम पर% पैरामीटर% को हल करने के लिए कई विकल्पों की कोशिश की लेकिन कोई भाग्य नहीं। मैं सोच सकता हूं कि% पैरामीटर% पार्स कर रहा है और इसे कंटेनर से लाया है, अभी तक कोई नवाचार नहीं है।

दूसरी ओर मेरे पास बड़ी तस्वीर देखने के लिए आपके पर्यावरण के बारे में पर्याप्त जानकारी नहीं है लेकिन मैं बस एक और विचार के साथ आया हूं। यदि आप अपने पैरामीटर को अपनी पैरामीटर में घोषित करते हैं तो यह काफी आसान हो सकता है। फ़ाइल फ़ाइल और कंटेनर के माध्यम से इसे अपने कंट्रोलर या सेवा में सरणी के रूप में लोड करें।

एप्लिकेशन/config/parameters.yml

parameters: 
    profiles: 
     germany: 
      locale: de_DE 
      host_name: http://de.example.com 
     uk: 
      locale: en_EN 
      host_name: http://uk.example.com 
     turkey: 
      locale: tr_TR 
      host_name: http://tr.example.com 

आप अपने नियंत्रक में एक सरणी के रूप में अपने सभी प्रोफ़ाइल हो सकती हैं।

<?php 

namespace Acme\DemoBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 


     $profiles = $this->container->getParameter('profiles'); 
     var_dump($profiles); 

     return $this->render('AcmeDemoBundle:Default:index.html.twig'); 
    } 
} 
इस दृष्टिकोण के साथ

  • आप एक कस्टम YamlLoader
  • कोड करने के लिए आप अन्य YML फाइलों में मानकों आयात करने के बारे में चिंता करने की जरूरत नहीं है की जरूरत नहीं है
  • आप हो सकता है आपके किसी भी समय आपके सरणी में $ कंटेनर है
  • आपको प्रोफ़ाइल फ़ाइलों को लोड/कैश करने की आवश्यकता नहीं है
  • आपको वाइल्डकार्ड फ़ाइल लोडिंग समाधान

यदि मुझे आपका प्रश्न सही तरीके से मिला है, तो यह दृष्टिकोण आपकी मदद कर सकता है।

1

मैं Symfony 2 कोड और डॉक्स (और यह तो सवाल के माध्यम से trawling किया गया है और जहां इस ढांचे के भीतर ही किया जाता है नहीं मिल रहा।

Symfony के निर्भरता इंजेक्शन घटक एक संकलक का उपयोग करता है अनुकूलन चरण के दौरान पैरामीटर संदर्भ को हल करने गुजरती हैं।

Compiler पंजीकृत संकलक अपने PassConfig उदाहरण से गुजरता हो जाता है। इस वर्ग a few compiler passes by default कॉन्फ़िगर करता है, जो ResolveParameterPlaceHoldersPass भी शामिल है।

कंटेनर संकलन के दौरान, ResolveParameterPlaceHoldersPass कंटेनर के ParameterBag से resolve strings का उपयोग %parameters% युक्त करता है। कंपाइलर पास तब उस हल किए गए मान को कंटेनर में वापस सेट करता है।

तो, मैं वास्तविक पैरामीटर मान प्राप्त करने के लिए% पैरामीटर को कैसे पार्स कर सकता हूं?

आपको अपने प्रोफाइल लोडर (या जहां भी आप फिट बैठते हैं) में कंटेनर तक पहुंच की आवश्यकता होगी। कंटेनर का उपयोग करके, आप resolveValue() विधि के माध्यम से हल किए जाने के लिए कंटेनर के पैरामीटर बैग पर अपने पार्स किए गए यमल कॉन्फ़िगरेशन पर फिर से घुमा सकते हैं और मानों को पास कर सकते हैं।


मुझे लगता है कि शायद आपके क्लीनर दृष्टिकोण को आपके बंडल कॉन्फ़िगरेशन में लागू करने के लिए होगा। इस तरह आपकी कॉन्फ़िगरेशन को परिभाषित संरचना के विरुद्ध सत्यापित किया जाएगा, जो कॉन्फ़िगरेशन त्रुटियों को जल्दी से पकड़ सकता है। अधिक जानकारी के लिए bundle configuration पर दस्तावेज़ देखें (वह लिंक v2.7 के लिए है, लेकिन उम्मीद है कि आपके संस्करण पर भी लागू होगा)।

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन मैंने अपनी परियोजनाओं के लिए इसे समझने में काफी समय बिताया है, इसलिए मैं यहां भविष्य के संदर्भ के लिए उत्तर पोस्ट कर रहा हूं।

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