2012-05-17 8 views
21

मैं सिम्फनी 2 का उपयोग कर रहा हूं और हमारे पास 2 कॉन्फ़िगरेशन, देव और प्रोड हैं। मुझे यह जानने की ज़रूरत है कि क्या मैं यह पता लगा सकता हूं कि कौन सी इकाई या मॉडल के अंदर उपयोग कर रहा हूं।सिमफनी 2 में एप कर्नेल पर्यावरण चर का उपयोग करना

मैं इस कोड AppKernel.php में पाया करने के लिए कुछ इसी तरह की तलाश में हूँ:

$this->getEnvironment() 

मैं यह है कि बहुत अच्छा होगा कॉल करने के लिए कर्नेल लोड कर सकता है, लेकिन मैं इसके लिए कोई तरीका नहीं ढूँढ सकते हैं इस। इस पर ध्यान देने के बाद ऐसा लगता है कि सिम्फनी घटनाएं कर्नेल को वापस कर सकती हैं लेकिन मुझे नहीं पता कि इन घटनाओं को कैप्चर करना है या नहीं, ताकि मैं उन पर getKernel() को कॉल कर सकूं। http://symfony.com/doc/current/book/internals.html

उदाहरण के लिए, वे इस उदाहरण सूची:

उपयोग Symfony \ घटक \ HttpKernel \ घटना \ FilterControllerEvent;

public function onKernelController(FilterControllerEvent $event) 
{ 
    $controller = $event->getController(); 
    // ... 

    // the controller can be changed to any PHP callable 
    $event->setController($controller); 
} 

यह स्पष्ट नहीं है कि कोड के इस ब्लॉक को कहां रखा जाए। ऐसा लगता है कि इसे कर्नेल में जाना चाहिए, और यदि मेरे पास कर्नेल था तो मुझे यह समस्या नहीं होगी।

मेरा सवाल यह है कि क्या यह निर्धारित करने के लिए मेरे पास एक आसान तरीका है कि क्या मैं सेवा या मॉडल से कर्नेल में सेट के रूप में 'देव' या 'प्रोड' में हूं या नहीं। धन्यवाद

उत्तर

44

कंसोल द्वारा उत्पन्न डिफ़ॉल्ट इकाई वर्ग कुछ भी प्राप्त नहीं करते हैं। इसका मतलब है कि वे किसी भी तरह से "कंटेनरवेयर" नहीं हैं।

और आम तौर पर बोलते हुए, मुझे नहीं लगता कि वे होना चाहिए। मैं चाहिए उस पर निर्भर आप कर रहे हैं, लेकिन आप कुछ बुनियादी निर्भरता इंजेक्शन

के साथ इस संभाल सकता एक नियंत्रक में क्या:

$entity = new \Your\Bundle\Entity\Foo(
    $this->container->get('kernel')->getEnvironment() 
); 

और फिर src में/आपका/बंडल/इकाई/Foo.php

private $env; 

public function __construct($env=null) 
{ 
    $this->env = $env; 
} 

क्या यह आपके लिए काम करेगा?

पीएस आपके द्वारा पोस्ट किया गया ईवेंट श्रोता नियंत्रकों के लिए है - मनमानी कक्षाओं के लिए नहीं।

+0

हाँ, धन्यवाद, कि था – ContextSwitch

+0

पुनर्रचना मैं Symfony 2.6 उपयोग कर रहा हूँ का एक सा के साथ अच्छी तरह से काम करेगा और मुझे करना था: $ kernel = $ this-> कंटेनर-> प्राप्त करें ('कर्नेल'); – Dominick

18

पैरामीटर के रूप में इसे प्राप्त करना भी संभव है। यदि आप \Symfony\Component\HttpKernel\Kernel कक्षा पर एक नज़र डालें तो आपको getKernelParameters() विधि मिलेगी जो सभी कर्नेल पैरामीटर का खुलासा करती है।

/** 
* Returns the kernel parameters. 
* 
* @return array An array of kernel parameters 
*/ 
protected function getKernelParameters() 
{ 
    $bundles = array(); 
    foreach ($this->bundles as $name => $bundle) { 
     $bundles[$name] = get_class($bundle); 
    } 

    return array_merge(
     array(
      'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir, 
      'kernel.environment' => $this->environment, 
      'kernel.debug' => $this->debug, 
      'kernel.name' => $this->name, 
      'kernel.cache_dir' => realpath($this->getCacheDir()) ?: $this->getCacheDir(), 
      'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(), 
      'kernel.bundles' => $bundles, 
      'kernel.charset' => $this->getCharset(), 
      'kernel.container_class' => $this->getContainerClass(), 
     ), 
     $this->getEnvParameters() 
    ); 
} 

तो एक services.yml फ़ाइल में आप एक कंटेनर जागरूक वर्ग में रहते हुए %kernel.environment% साथ वातावरण प्राप्त कर सकते हैं आप ऐसा करके प्राप्त कर सकते हैं:

$this->getContainer()->getParameter('kernel.environment'); 

see Kernel.php class on github

+0

मैं यह सुनिश्चित करने के लिए 'पैरेंट :: get कर्नेल पैरामीटर()' विधि को कॉल करने की अनुशंसा करता हूं ताकि किसी भी पैरामीटर को न भूलें यदि कोई सिम्फनी के अगले रिलीज़ में जोड़ा गया है :) 'वापसी array_merge (parent :: getKernelParameters() , सरणी (...)); ' –

3

बेशक जल्दी है और globals के गंदे तरीके ...

function quickAndDirty() { 
    global $kernel; 

    if ($kernel->getEnvironment() == 'dev') { 
     // we're in dev mode 
    } 
} 

इसका बुरा और बुराई और आप इसे उपयोग करने के बाद अपने आप को धोना चाहिए, लेकिन एक बड़े मौजूदा codebase है कि आप शायद विरासत में मिला के मामले में, यह एक संभावित रिफैक्टरिंग दुःस्वप्न की बचत होती है।

बेशक

, चाहे आप इस तरह के एक विधि का उपयोग करने के बाद खुद के साथ रह सकते हैं, आप पर निर्भर है;)

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