Symfony2 Twig Templates में config पैरामीटर कैसे प्राप्त करें


170

मेरे पास एक Symfony2 Twig टेम्पलेट है। मैं इस टहनी टेम्पलेट (एक संस्करण संख्या) में एक कॉन्फ़िगर पैरामीटर के मूल्य को आउटपुट करना चाहता हूं। इसलिए मैंने विन्यास पैरामीटर को इस तरह परिभाषित किया:

parameters:
    app.version: 0.1.0

मैं कन्ट्रोलर्स में इस कॉन्फिगर पैरामीटर का उपयोग करने में सक्षम हूं, लेकिन मेरे पास यह नहीं है कि इसे मेरे ट्विग टेम्पलेट में कैसे प्राप्त किया जाए।

जवाबों:


406

आप विन्यास के टहनी गोलाकार खंड में पैरामीटर प्रतिस्थापन का उपयोग कर सकते हैं :

पैरामीटर कॉन्फ़िगरेशन:

parameters:
    app.version: 0.1.0

टहनी विन्यास:

twig:
    globals:
        version: '%app.version%'

टहनी टेम्पलेट:

{{ version }}

यह विधि आपको ContainerAwareकक्षाओं में पैरामीटर का उपयोग करने की अनुमति देने का लाभ प्रदान करती है , साथ ही:

$container->getParameter('app.version');

अच्छा उत्तर। परिशिष्ट: सिम्फनी 3.1 के बाद से एक चर को उद्धृत किया जाना चाहिए: "% app.version%"
BigJ

@BigJ: उद्धरण शामिल करने के लिए अद्यतित, क्योंकि यह पुराने संस्करणों में भी काम करेगा।
रयाल

2
यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए। धन्यवाद !
साइरिल

191

आसानी से, आप अपनी कॉन्फ़िग फ़ाइल में परिभाषित कर सकते हैं:

twig:
    globals:
        version: "0.1.0"

और इसे अपने टेम्पलेट में एक्सेस करें

{{ version }}

अन्यथा यह आपके मापदंडों को उजागर करने के लिए एक टहनी एक्सटेंशन के साथ एक तरीका होना चाहिए।


28
@Ryall जैसे मापदंडों में इसे सेट करने के लिए बेहतर है।
मिग्लास

89

आप अंतर्निहित सेवा पैरामीटर प्रणाली का लाभ भी उठा सकते हैं, जो आपको मूल्य को अलग या पुन: उपयोग करने देता है:

# app/config/parameters.yml
parameters:
    ga_tracking: UA-xxxxx-x

# app/config/config.yml
twig:
    globals:
        ga_tracking: "%ga_tracking%"

अब, चर Ga_tracking सभी Twig टेम्पलेट्स में उपलब्ध है:

<p>The google tracking code is: {{ ga_tracking }}</p>

नियंत्रक के अंदर भी पैरामीटर उपलब्ध है:

$this->container->getParameter('ga_tracking');

आप एक सेवा को वैश्विक ट्विग चर के रूप में भी परिभाषित कर सकते हैं (Symfony2.2 +):

# app/config/config.yml
twig:
    # ...
    globals:
        user_management: "@acme_user.user_management"

http://symfony.com/doc/current/templating/global_variables.html

यदि आप जिस ग्लोबल वैरिएबल को सेट करना चाहते हैं, वह अधिक जटिल है - कोई ऑब्जेक्ट कहें - तो आप उपरोक्त विधि का उपयोग नहीं कर पाएंगे। इसके बजाय, आपको एक Twig एक्सटेंशन बनाने और getGlobals विधि में प्रविष्टियों में से एक के रूप में वैश्विक चर वापस करने की आवश्यकता होगी ।


5
यह सबसे अच्छा समाधान की तरह दिखता है क्योंकि यह सिस्टम के सभी ज्ञान को एक साथ रखता है।
जैनीस ग्रूजिस

19

Symfony2 के नए संस्करणों पर ( parameters.ymlइसके बजाय का उपयोग करके parameters.ini), आप कुंजी-मूल्य जोड़े के बजाय ऑब्जेक्ट या सरणियों को संग्रहीत कर सकते हैं, इसलिए आप अपने ग्लोबल्स को इस तरह से प्रबंधित कर सकते हैं:

config.yml (केवल एक बार संपादित किया गया):

# app/config/config.yml
twig:
  globals:
    project: %project%

parameters.yml:

# app/config/parameters.yml
project:
  name:       myproject.com
  version:    1.1.42

और फिर एक टहनी फ़ाइल में, आप उपयोग कर सकते हैं {{ project.version }}या {{ project.name }}

नोट: मैं व्यक्तिगत रूप से चीजों को जोड़ना पसंद कर रहा हूं app, सिर्फ इसलिए कि सिम्फनी का चर है और मुझे नहीं पता कि भविष्य में वहां क्या संग्रहीत किया जाएगा।


16

ऊपर दी गई चींटियाँ सही हैं और ठीक काम करती हैं। मैंने एक अलग तरीके से इस्तेमाल किया।

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: app.yml }
    - { resource: app_twig.yml }

app.yml

parameters:
  app.version:           1.0.1

app_twig.yml

twig:
  globals:
    version: %app.version%

अंदर नियंत्रक:

$application_version = $this->container->getParameter('app.version');
// Here using app.yml

अंदर टेम्पलेट / टहनी फ़ाइल:

Project version {{ version }}!
{#  Here using app_twig.yml content.  #}
{#  Because in controller we used $application_version  #}

नियंत्रक आउटपुट का उपयोग करने के लिए:

नियंत्रक:

public function indexAction() {
        $application_version = $this->container->getParameter('app.version');
        return array('app_version' => $application_version);
    }

टेम्पलेट / टहनी फ़ाइल:

Project version {{ app_version }}

मैंने बेहतर समझने के लिए भिन्न का उल्लेख किया।


1
हाँ अच्छा है, यह जवाब बहुत अच्छी तरह से दोनों तरह से बताता है: नियंत्रक के माध्यम से गुजर रहा है और इसे एक वैश्विक टहनी चर के रूप में पारित कर रहा है! +1
गॉटलीब नॉट्सबेलबेल

12

एक Twig एक्सटेंशन के साथ, आप एक parameterTwig फंक्शन बना सकते हैं :

{{ parameter('jira_host') }}

TwigExtension.php:

class TwigExtension extends \Twig_Extension
{
    public $container;

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('parameter', function($name)
            {
                return $this->container->getParameter($name);
            })
        ];
    }


    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'iz';
    }
}

service.yml:

  iz.twig.extension:
    class: IzBundle\Services\TwigExtension
    properties:
      container: "@service_container"
    tags:
      - { name: twig.extension }

इसके लिए धन्यवाद, मुझे चिंता थी कि मुझे पैरामीटर फ़ाइल से पैरामीटर को ट्विग ग्लोबल्स में डुप्लिकेट करना था।
जो याओचौकी

अच्छा है, लेकिन यह एक पैरामीटर के विस्तार के लिए एक अनावश्यक ओवरलोड पुल पूरे कंटेनर नहीं है?
लाजदक मारेक

मुझे विश्वास है कि सिम्फनी 2 के साथ, आप कंटेनर मापदंडों को इंजेक्ट नहीं कर सकते (जो अब सिम्फनी 4/5 के साथ संभव है)
थॉमस डेकाक्स


-3

Confing.yml में

# app/config/config.yml
twig:
  globals:
    version: '%app.version%'

टहनी दृश्य में

# twig view
{{ version }}

2
पूरी सेवा कंटेनर तक पहुंच देना एक अच्छा विचार नहीं है। कंटेनर एक सेवा लोकेटर है और यह भी निर्भरता इंजेक्शन के साथ इंजेक्शन नहीं होना चाहिए, इसलिए न तो टहनी में
पॉल एंड्रीक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.