2011-08-13 5 views
27

क्यों ट्विग दस्तावेज शामिल करने के बजाय विस्तार का उपयोग करने की सिफारिश करता है? सिम्फनी 2 दस्तावेज कहता है क्योंकि "सिम्फनी 2 में, हम इस समस्या के बारे में अलग-अलग सोचना पसंद करते हैं: एक टेम्पलेट को दूसरे द्वारा सजाया जा सकता है।" लेकिन कुछ भी नहीं। यह सिर्फ लेखक की सनकी है या कुछ और? मदद के लिए धन्यवाद।विस्तार या सहित - Twig में बेहतर क्या है?

उत्तर

42

जब विरासत उपयोग करने के लिए:

आप एक ही लेआउट साझा करने 50 पृष्ठों है - आप एक माता पिता के रूप में एक layout.twig बनाते हैं, और प्रत्येक पृष्ठ फैली कि layout.twig। तो माता-पिता सामान्य है और बच्चा विशिष्ट है।

जब उपयोग करने के लिए शामिल हैं:

50 पृष्ठों में से, वहाँ 6 पृष्ठों है कि HTML का एक हिस्सा साझा कर रहे हैं - आप एक साझा-chunk.twig बना सकते हैं और उन 6 पन्नों में यह शामिल है।

एक और उपयोग:

आप देखेंगे कि आपके layout.twig बिट अव्यवस्थित है नोटिस और आप इसे modularize चाहते हैं, तो आप एक अलग फ़ाइल में sidebar.twig विभाजित है और layout.twig में शामिल।

आप विरासत यूज-केस के लिए उपयोग कर सकते हैं शामिल हैं:

ज़रूर, शीर्ष, पादुका और क्या आप के लिए हिस्सा बनाते हैं, और उपयोग 50 पृष्ठों में से प्रत्येक में भी शामिल है। लेकिन उपरोक्त समझाया गया यह गलत डिजाइन है।

आप शामिल यूज-केस के लिए विरासत का उपयोग कर सकते:

ज़रूर, माता पिता layout.twig में साझा हिस्सा के लिए एक खाली ब्लॉक बनाने के लिए, और एक दूसरे स्तर बच्चे लेआउट-साथ-हिस्सा पैदा करते हैं। twig जो लेआउट.twig को बढ़ाता है और खंड ब्लॉक में भरता है, और उपरोक्त उदाहरण में 6 पृष्ठ जो खंड साझा करते हैं, लेआउट.twig के बजाय लेआउट-साथ-chunk.twig का विस्तार कर सकते हैं। लेकिन यह फिर से गलत डिजाइन है क्योंकि खंड बच्चों को सभी बच्चों द्वारा साझा नहीं किया जाता है और आधार माता-पिता में नहीं जाना चाहिए। इसके अलावा आप विरासत के पेड़ को अव्यवस्थित कर चुके हैं।

तो:

जैसा कि ऊपर समझाया - यह डिजाइन नहीं प्रोग्रामिंग की बात है। यह इस बारे में नहीं है: मैं एक अलग प्रोग्रामिंग तकनीक का उपयोग करके इसी परिणाम को प्राप्त कर सकता हूं, जिसके बारे में उपयोग बेहतर डिजाइन है।

+0

"निश्चित रूप से, हेडर, पाद लेख के लिए भाग बनाएं ... लेकिन यह ऊपर वर्णित गलत डिजाइन है।" - मुझे नहीं लगता कि यह "गलत" है अगर यह आपके डिजाइन या मानसिकता को बेहतर बनाता है। लेकिन आम तौर पर, आपको शायद विरासत की नकल करने के लिए * एकाधिक * शामिल (हेडर + पाद लेख न्यूनतम) का उपयोग करना होगा, जो शायद कम कुशल है और जटिलता को जोड़ता है। –

3

यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। एक दृश्य विस्तार करके, आप सजावटी पैटर्न का उपयोग कर रहे हैं। यदि आप सिम्फनी 1 से परिचित हैं, तो यह आपकी लेआउट.एफ़.पी. फ़ाइल है जो $ sf_content आउटपुट करता है। जब आप एक सामान्य एचटीएमएल 'खोल' रखते हैं तो आप इस विधि का उपयोग करते हैं, जिसे आप प्रोजेक्ट में उपयोग करना चाहते हैं।

दूसरी तरफ एक दृश्य सहित, आप दूसरे में एक दृश्य को इंजेक्ट करने देते हैं।

मान लें कि आपके पास 'बारे में' और 'संपर्क' पृष्ठों के साथ एक निजी साइट है। base.html.twig
about.html.twig
contact.html.twig

base.html.twig आम एचटीएमएल है कि आपकी साइट बोर्ड भर में होती है जिसका उपयोग: आप 3 बार देखा गया होगा। इसमें आपके हेडर, नेविगेशन, पाद लेख इत्यादि शामिल हो सकते हैं (सभी सामान जो पृष्ठों में नहीं बदलते/नहीं बदलते हैं।)

about.html.twig और contact.html.twig केवल उन विशिष्ट अनुभागों के लिए HTML शामिल हैं। इन दोनों विचारों में base.html.twig का विस्तार किया गया है। यह कोड डुप्लिकेशन को समाप्त करता है। base.html.twig - आप शीर्ष लेख में होने वाले बदलाव बनाना चाहते हैं, तो आप सिर्फ एक ही स्थान पर परिवर्तन करने की जरूरत है।

अब मान लें कि आपके पास 'अन्य' और 'संपर्क' पृष्ठों पर प्रदर्शित होने वाली सामग्री का कुछ अन्य भाग है (लेकिन अन्य पृष्ठों पर जरूरी नहीं है) - आप इसके लिए एक अलग दृश्य बना सकते हैं और इसे about.html.twig के भीतर शामिल कर सकते हैं और contact.html.twig

दस्तावेज़ वास्तव में विस्तार करने की अनुशंसा नहीं करते हैं, वे दो अलग-अलग विधियां हैं जिनका उपयोग विशिष्ट उद्देश्यों के लिए किया जाना चाहिए।

आशा है कि इससे मदद मिलती है!

+0

ठीक रेंडर, लेकिन उपयोग करने के लिए केवल शामिल आसान नहीं होगा ? Base.html.twig होगा: Header.html.twig और Footer.html.twig और About.html.twig इस तरह दिखेगा: 0,123,include Header.html.twig include PieceOfContent.html.twig about etc include Footer.html.twig मैं विस्तार का उपयोग करने से कोई लाभ नहीं दिख रहा। हालांकि, अगर Base.html.twig इस तरह दिखेगा: Header Block of specific content from about, contact etc Menu - the same for all pages Another block of specific content Footer तो हम 2 फ़ाइलें केवल का उपयोग कर की तुलना में कम होगा शामिल हैं - कि सभी है? – Isinlor

+0

आपकी साइट के सभी 'पृष्ठ' दृश्यों में header.html.twig और footer.html.twig सहित खराब प्रोग्रामिंग है। वे तत्व आपकी साइट पर आम हैं, इसलिए उन्हें base.html.php में केवल एक बार शामिल किया जाना चाहिए। इस बारे में सोचें कि अब आप header.html.twig को शामिल नहीं करना चाहते हैं, लेकिन कुछ OtherHeader.html.twig को शामिल करना चाहते हैं। अब आपको अपने विचारों के बीच सभी शामिल करना होगा। आप इसे base.html.twig में डालने से बेहतर हैं। अंगूठे का सामान्य नियम, किसी भी HTML दोहराया जाता है कि के लिए अपनी साइट इसके अलावा base.html.twig –

+0

में अंतर्गत आता है है अपने उदाहरण एक बड़ी समस्या है: आप शीर्ष लेख सहित और दो बार पाद रहे हैं। एक बार base.html.twig में, फिर एक बार फिर about.html.twig में। आप उस पृष्ठ के लिए प्रासंगिक * केवल * HTML शामिल करने के लिए about.html.twig चाहते हैं। शीर्षलेख और पाद लेख लगभग पृष्ठ से पूरी तरह अलग हैं, और आपके सेटअप को इसे प्रतिबिंबित करना चाहिए। –

1

ट्विग एक्सटेंशन अलग-अलग और शामिल होने से कहीं अधिक शक्तिशाली है। जिस तरह से आप सोचने के बारे में सोच रहे हैं उसके विपरीत से विस्तार के बारे में सोचने की कोशिश करें। विस्तार के साथ आप अंत दृश्य (यानी ..htm) से शुरू कर सकते हैं और पीछे की ओर काम कर सकते हैं, जो परतों को साइट पर पृष्ठ बनाने के लिए जोड़ते हैं। प्रत्येक स्तर पर, विस्तार के साथ सामग्री के ब्लॉक या तो ओवरराइट या उस ब्लॉक के लिए मूल सामग्री में जोड़ें।

"शामिल करें" लचीला नहीं है, आप आधार टेम्पलेट से शुरुआत कर रहे हैं और लगभग एचटीएम दृश्य में अपना रास्ता काम कर रहे हैं, और आप विभिन्न फ़ाइलों में सामग्री के सामान्य ब्लॉक के साथ काम नहीं कर सकते हैं।

तीन स्तरीय विरासत है, जो एक आम विस्तार पैटर्न है पर इस बिट चेक आउट: http://symfony.com/doc/current/book/templating.html#three-level-inheritance

7

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

उदा। मैं इतनी तरह मेरे आधार लेआउट का विस्तार,:

{% extends "layout/default.html" %} 

क्या विस्तार अब मुझे दे, माता पिता से ब्लॉक का उपयोग करने के लिए है!आपके पास इसमें शामिल नहीं है। अब आप उदास कर सकते हैं प्रत्येक पृष्ठ के लिए विशेष रूप से एक शीर्षक बनाने:

{% include 'header.html' %} 

और अधिक से अधिक हो सकता है entitiy repitition, उदहारण के लिए:

{% block title %}My title just for this page{% endblock %} 

अब, सहित आप और अधिक कठोर और निश्चित एचटीएमएल, उदाहरण के लिए देता है तालिका पंक्तियों:

{% include 'foo' with {'foo': 'bar'} %} 

तो आप अपने लेआउट का निर्माण भी शामिल है के साथ है, और आप यकीन है कि आपकी साइट नामित डिजाइन इस प्रकार बनाने के लिए अपने आधार का विस्तार लेआउट।

+0

"अब मुझे क्या विस्तार देना है, माता-पिता से ब्लॉक का उपयोग करना है! आपके पास इसमें शामिल होने के साथ नहीं है।" मेरे पास है - {% set title%} मेरा शीर्षक सिर्फ इस पृष्ठ के लिए {% endet%} और { {शीर्षक}}। यह वही कार्यक्षमता है लेकिन दूसरी दिशा में, केवल अंतर यह है कि - ब्लॉक में मैं डिफ़ॉल्ट सामग्री को ब्लॉक में सेट कर सकता हूं लेकिन जब मैं डिफ़ॉल्ट सामग्री सेट करने के लिए शामिल करता हूं तो मुझे स्थिति का उपयोग करना होगा। – Isinlor

+0

यह एक अच्छा ठोस उदाहरण है। – alexw

5

बस मिश्रण में एक और, हाइब्रिड, विकल्प जोड़ने के लिए, आप embed पर भी विचार कर सकते हैं। यह आपको extends से विरासत का लाभ उठाने देता है लेकिन include करता है जैसे कई पुन: उपयोग की अनुमति देता है।

तुच्छ उदाहरण:

"partials/titleize।टहनी ":

<h2 class="title">{% block title %}Default Title{% endblock %}</h2> 

" कुछ-template.twig "यह embed का उपयोग करने से प्राप्त कर लेंगे:

{% embed "partials/titleize.twig" %} 
    {% block title %}Section 1{% endblock %} 
{% endembed %} 

... 

{% embed "partials/titleize.twig" %} 
    {% block title %}Section 2{% endblock %} 
{% endembed %} 

<h2 class="title">Section 1</h2> 
... 
<h2 class="title">Section 2</h2>