2013-06-04 11 views
5

नोट: क्या मैं यहाँ कर रहा हूँ embedding controllers < है --- एक समान (सरकारी) उदाहरण के लिए कि लिंक देखें।Symfony2 - टहनी नियंत्रक प्रस्तुत करना और लौट सरणी प्रतिक्रिया

मैं एक टहनी टेम्पलेट से कोई नियंत्रक कहते हैं, और है कि नियंत्रक एक सरणी कि मैं तो मेरे टेम्पलेट के बाकी भर में उपयोग कर सकते हैं वापसी करना चाहते हैं।

मैं व्यक्तिगत चर के साथ ऐसा कर सकते हैं: ("The Response content must be a string or object implementing __toString(), "array" given.")ही टहनी के साथ: नियंत्रक

टहनी

{% set testVar = render(controller('AppBundle:Test:index')) %} 

class TestController extends Controller 
{ 
    public function testAction() 
    { 
     return new Response('OH HAI'); 
    } 
} 

हालांकि, निम्नलिखित एक अपवाद फेंकता फ़ाइल

public function testAction() 
{ 
    return new Response(array('test' => 1, 'foo' => 'bar')); 
} 

यह ऊपर अपवाद फेंकता है। प्रस्तुत करने के लिए नियंत्रक के लिए एक डमी, बेकार अतिरिक्त टेम्पलेट बनाने के बिना मैं को कैसे प्राप्त कर सकता हूं?

+2

आप जो करने की कोशिश कर रहे हैं वह एमवीपी पैटर्न तोड़ रहा है (आप दृश्य परत में तर्क डाल रहे हैं)। मेरी सलाह आपके समाधान पर पुनर्विचार है। हो सकता है कि यदि आप और अधिक कहें जो आप प्राप्त करना चाहते हैं तो मैं और कह सकता हूं। चीयर्स! – Cyprian

+0

उत्तर @ साइप्रियन के लिए धन्यवाद, मुझे ऐसा करने में गलत लगा, तो शायद एक और तरीका है। मेरा दृश्य 3 ट्विग टेम्पलेट्स में विभाजित है जो एक लेआउट टेम्पलेट का विस्तार करता है: ** हेडर **, ** साइडबार ** और ** सामग्री **। * साइडबार * प्रत्येक पृष्ठ लोड पर गतिशील डेटा की आवश्यकता होगी (उदाहरण के लिए कुछ लाइव आंकड़े)। मुझे साइडबार में इस डेटा को शामिल करने की आवश्यकता है चाहे कोई भी सामग्री * टेम्पलेट में क्या हो। – Jimbo

+0

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

उत्तर

5

जो कुछ आप चाहते हैं उसे प्राप्त करने का मानक तरीका ऐसा कुछ दिखता है।

मान लें कि आपके पास नियमित कार्यवाही है। उदाहरण के लिए।

class TestController extends Controller 
{ 
    public function testAction() 
    { 
     return $this->render('AppBundle:Test:index.html.twig'); 
    } 
} 

और टेम्पलेट:

<html> 
    <body> 
     {% block sidebar %} 
      {{ controller('AppBundle:Test:sidebar') }} 
     {% endblock %} 
     {% block content %} 
      Hello world 
     {% endblock %}      
    </body> 
</html> 

इसके बाद आप साइडबार के लिए कुछ कार्रवाई बनाने की जरूरत है। ध्यान दें कि इस तरह से आप अपनी दृश्य परत में कोई तर्क डालते हैं।

class BaseController extends Controller 
{ 
    public function sidebarAction() 
    { 
     $status = $this->get('some.status.logic')->retrieveStatus(); 

     return $this->render('AppBundle:Base:sidebar.html.twig', array(
      'status' => $status, 
     )); 
    } 
} 

और अपने Base/sidebar.html.twig:

<div class="sidebar"> 
    {{ status.showStatusInfo() }} 
</div> 

और इतना ही है। आप इस तरह से एमवीपी तोड़ नहीं रहे हैं, क्योंकि आपके पास अभी भी आपकी दृश्य परत में कोई तर्क नहीं है (साइडबार के लिए तर्क BaseController में है)।

+0

मुझे लगता है कि मैं अमूर्तता के बहुत से स्तरों के बारे में चिंता कर रहा था, लेकिन यह कार्रवाई का सबसे अच्छा तरीका प्रतीत होता है। चीयर्स! – Jimbo

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