2015-06-26 4 views
11

के बजाय उपयोग करने के लिए क्या उपयोग करें मुझे लगता है कि Twig_Loader_String कक्षा को बहिष्कृत कर दिया गया है और इसे Twig 2.0 में हटा दिया जाएगा। साथ ही, स्रोत में टिप्पणियां इंगित करती हैं कि इसे "का उपयोग कभी भी" नहीं किया जाना चाहिए।Twig_Loader_String

एक ट्रिग टेम्पलेट युक्त एक स्ट्रिंग के लिए कई वैध उपयोग मामले हैं।

सवाल यह है कि इसके बजाय क्या उपयोग करना है?

उत्तर

5
$tplName = uniqid('string_template_', true); 
$env = clone $this->getTwig(); 
$env->setCache(false); 
$env->setLoader(new \Twig_Loader_Array([ $tplName => 'Hello, {{ name }}' ])); 
$html = new Response($env->render($tplName, [ 'name' => 'Bob' ])); 

echo $html; // Hello, Bob 
+0

यह वही करता है जो मैं मूल रूप से करना चाहता था और कैश फ़ाइलों की परेशानी के बिना। धन्यवाद! –

+1

'$ twig' कहां से आता है? क्या यह '$ env-> setCache (false)' नहीं होना चाहिए? – rolandow

+1

धन्यवाद @rolandow मैंने स्निपेट बदल दिया –

19

Twig_Environment#createTemplate, इस्तेमाल किया जाना चाहिए के रूप में issue deprecating Twig_Loader_String में संकेत:

// the loader is not important, you can even just 
// use the twig service in Symfony here 
$twig = new \Twig_Environment(...); 

$template = $twig->createTemplate('Hello {{ name }}!'); 
echo $template->render(['name' => 'Bob']); 

इस कोड को सबसे आसान तरीका है और पूर्ण संचय सिस्टम नजरअंदाज। इसका मतलब है कि इसमें Twig_Loader_String की बुरी चीजें नहीं हैं (जब भी आप render पर कॉल करते हैं तो यह एक नई कैश प्रविष्टि नहीं बनाता है; इसमें अन्य टेम्पलेट्स संदर्भित करने में समस्या नहीं है;), लेकिन यह अभी भी नहीं है Twig_Loader_Array (जैसा कि @ AlainTiemblo के उत्तर द्वारा दिखाया गया है) या Twig_Loader_Filesystem का उपयोग करने के रूप में जल्दी।

+2

यह वास्तव में काम नहीं करता है की कोशिश करो। सबसे पहले, Twig_Loader_Array :: __ निर्माण() को केवल एक पैरामीटर के रूप में एक सरणी की आवश्यकता होती है। दूसरा, इसे ठीक करने के बाद, रेंडर() कॉल एक कैचबल घातक त्रुटि फेंकता है: वर्ग का ऑब्जेक्ट __TwigTemplate_dd0d0e2c37a2d0f8b67dcdcd30ecb79029586ee23cd1c76f343d6878b2fdbb35 स्ट्रिंग त्रुटि में परिवर्तित नहीं किया जा सका। –

+0

मुझे खेद है, @AlainTiemblo। जल्दी और सोचा कि आपने केवल ब्लॉकक्वॉइट शैली को हटा दिया है।मैंने आपके परिवर्तनों को दोबारा वापस ले लिया है और फिर उन्हें दूसरे कोड से बदल दिया है, जो थोड़ा सा अच्छा काम करता है। –

+0

यह twig_loader_array की टिप्पणियों में भी कहा जाता है कि इसे केवल यूनिट परीक्षण वातावरण में उपयोग किया जाना चाहिए, न कि उत्पादन में – Sharpy35

-2

यह वास्तव में अपेक्षा के अनुरूप काम करने लगता है:

$tplName = uniqid('string_template_', true); 
$env = clone $this->getTwig(); 
$env->setLoader(new \Twig_Loader_Array([ $tplName => 'Hello, {{ name }}' ])); 
$html = new Response($env->render($tplName, [ 'name' => 'Bob' ])); 
$cacheName = $env->getCacheFilename($tplName); 
if(is_file($cacheName)) 
{ 
    unlink($cacheName); 
} 
echo $html; // Hello, Bob 

मैं संकेत मिला: http://twig.sensiolabs.org/doc/recipes.html#using-different-template-sources

ध्यान दें कि कैश फ़ाइल को हटाना वांछनीय नहीं होगा यदि टेम्पलेट स्ट्रिंग डेटाबेस से या कुछ इसी तरह से आती है। मैं इस कार्यक्षमता का उपयोग टेम्पलेट्स को प्रतिपादित करने के लिए करता हूं जो गतिशील रूप से बनाए जाते हैं और आमतौर पर डिबगिंग और परीक्षण करते समय बहुत कम जीवन काल होते हैं।

+0

\ Twig_Loader_array केवल यूनिट परीक्षण – Sharpy35

1
$environment = new \Twig_Environment(new \Twig_Loader_Array(array())); 
$template = $environment->createTemplate('{{ template }} {{ replacements }}'); 

echo $template->render([replacements]); 
+0

के लिए उपयोग किया जाना चाहिए यह काम नहीं करेगा, 'lib/Twig/Loader/Array' देखें .php': 'सार्वजनिक फ़ंक्शन __construct (सरणी $ टेम्पलेट्स)' –

+0

क्षमा करें यह कन्स्ट्रक्टर में एक खाली सरणी होना चाहिए। (या कोई पूर्वनिर्धारित टेम्पलेट जिन्हें आप सेट करना चाहते हैं।) मैंने अपना जवाब संपादित कर लिया है। – Jon

+0

हाँ इस तरह ठीक है, लेकिन ध्यान रखें कि आप टवीग कैशिंग सिस्टम का लाभ नहीं उठाते हैं। वैसे भी स्ट्रिंग लोडर के लिए यह एक सही उत्तर/कामकाज है। –

9

Twig_Loader_Array लोडर $templateName => $templateContents तर्क के रूप में की एक सरणी लेता है, इसलिए कुछ कैश सामान टेम्पलेट नाम का उपयोग किया जा सकता है।

तो यह कार्यान्वयन काम करता है:

$templates = array('hello' => 'Hello, {{ name }}'); 
$env = new \Twig_Environment(new \Twig_Loader_Array($templates)); 
echo $env->render('hello', array('name' => 'Bob')); 

या:

$env = new \Twig_Environment(new \Twig_Loader_Array(array())); 
$template = $env->createTemplate('Hello, {{ name }}'); 
echo $template->render(array('name' => 'Bob')); 

स्पष्ट अफवाह बनाने के लिए, बहुत पहले टहनी संस्करण के बाद से, Twig_Loader_Array इसके निर्माता में एक सरणी लेता है। सरणी के बिना Twig_Loader_Array प्रारंभ करने वाले सभी उत्तर गलत हैं।

0

सबसे अच्छा है: http://twig.sensiolabs.org/doc/2.x/recipes.html#loading-a-template-from-a-string

मेरे द्वारा इस्तेमाल किया उदाहरण के रूप में:

public function parse($content, $maxLoops = 3, $context = array()) 
{ 
    if (strlen($content) < 1) { 
     return null; 
    } 

    for ($i = 0; $i < $maxLoops; $i++) { 
     $template = $this->container->get('twig')->createTemplate($content); 
     $result = $template->render($context); 

     if ($result == $content) { 
      break; 
     } else { 
      $content = $result; 
     } 
    } 

    return $content; 
} 
3

यह

$template = $this->container->get('twig')->createTemplate('hello {{ name }}'); 
echo $template->render(array('name' => 'Fabien')); 
+0

यह अच्छी तरह से काम करता है। इसे कब जोड़ा गया था? –