2011-06-24 10 views

उत्तर

25

CompilerPass कार्यान्वयन कुछ प्रकार के श्रोताओं हैं जिन्हें निर्भरता इंजेक्शन कंटेनर कॉन्फ़िगरेशन फ़ाइलों से बनाया गया है और इसे कैश में सादे PHP के रूप में सहेजने से पहले निष्पादित किया जाता है। इन्हें कुछ संरचनाओं का निर्माण करने के लिए उपयोग किया जाता है जिन्हें बाहरी संसाधनों से परिभाषाओं तक पहुंच की आवश्यकता होती है या कुछ प्रोग्रामिंग की आवश्यकता होती है जो एक्सएमएल/वाईएएमएल कॉन्फ़िगरेशन में उपलब्ध नहीं है। आप उन्हें "अंतिम फ़िल्टर" के रूप में देख सकते हैं जो पूरे डीआईसी को संशोधित कर सकते हैं।

चलो एक ट्विगबंडल और इसके TwigEnvironmentPass पर विचार करें। क्या यह होता है काफी सरल है:

  1. twig सेवा (<service id="twig" class="..." ...> के रूप में परिभाषित)
  2. के लिए एक संदर्भ लायें सभी सेवाओं है कि twig.extension टैग के साथ टैग कर दिया गया है का पता लगाएं। ऐसा करने के लिए आपके पास पूर्ण डीआईसी (एक्सएमएल कॉन्फ़िगरेशन फाइलों से बनाया गया) पर काम है क्योंकि उन सेवाओं को किसी भी बंडल में परिभाषित किया जा सकता है।
  3. सेवा निर्माण विधि के लिए एक कस्टम कोड बनाएं।

एक अंतिम परिणाम के रूप में निम्नलिखित कोड जनरेट किया जाएगा:

protected function getTwigService() 
{ 
    $this->services['twig'] = $instance = new \Twig_Environment($this->get('twig.loader'), ...); 

    // THIS HAS BEEN ADDED THANKS TO THE TwigEnvironmentPass: 
    $instance->addExtension(new \Symfony\Bundle\SecurityBundle\Twig\Extension\SecurityExtension($this->get('security.context'))); 
    $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\TransExtension($this->get('translator'))); 
    $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\TemplatingExtension($this)); 
    $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\FormExtension(array(0 => 'TwigBundle::form.html.twig', 1 => 'SiteBundle::widgets.html.twig'))); 
    $instance->addExtension(new \MyProject\SiteBundle\Twig\Extension\MyVeryOwnExtensionToTwig($this)); 

    return $instance; 
} 
+0

अच्छी व्याख्या, धन्यवाद! – acme