2012-01-11 14 views
8

मैं Symfony2 में ContainerAwareCommand से एक ईमेल भेजने की कोशिश कर रहा हूं। लेकिन मैं यह अपवाद है जब ईमेल टेम्पलेट है मिल द्वारा प्रस्तुत:Symfony2 अनुरोध के बिना टेम्पलेटिंग

$body = $this->templating->render($template, $data); 

अपवाद:

("You cannot create a service ("templating.helper.assets") of an inactive scope ("request").") 

मैं GitHub में पाया कि इस सहायक अनुरोध वस्तु की जरूरत है। कोई जानता है कि मैं अनुरोध ऑब्जेक्ट को कैसे उदाहरण दे सकता हूं?

उत्तर

1

चूंकि आप एक अनुरोध नहीं है, तो आप इस तरह सीधे templating सेवा को कॉल करने की जरूरत है:

$this->container->get('templating')->render($template, $data); 
+3

यह समस्या का समाधान नहीं करता है। चूंकि संपत्ति के रूप में लॉग इन का उपयोग किया जाता है (संभवतः आपके टेम्पलेट्स में सीधे दिखाई नहीं देनी चाहिए) इसे किसी भी तरह से RequestContext सेवा की आवश्यकता है। – BetaRide

+0

मुझे एक ही त्रुटि मिल रही है लेकिन यह समाधान समस्या का समाधान नहीं करता है। Http://stackoverflow.com/questions/17942738/erro-you-cannot-create-a-service-templating-helper-assets-of-an- निष्क्रिय -स्को – vishal

+0

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

19

आप सही गुंजाइश में कंटेनर सेट और यह एक (फर्जी) अनुरोध देने के लिए की जरूरत है। ज्यादातर मामलों में यह पर्याप्त होगा:

//before you render template add bellow code 
$this->getContainer()->enterScope('request'); 
$this->getContainer()->set('request', new Request(), 'request'); 

पूरी कहानी here है। यदि आप विवरण जानना चाहते हैं तो यह issue on github पढ़ें।

+1

एफवाईआई: इसे हटा दिया गया था और सिम्फनी 3 में हटा दिया गया था, और सेवा स्तर पर "सेटस्कोप" के साथ प्रतिस्थापित किया गया था: https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#dependencyinjection – Rvanlaak

4

समस्या उत्पन्न होती है क्योंकि आप अपने टेम्पलेट में संपत्ति() फ़ंक्शन का उपयोग करते हैं।

डिफ़ॉल्ट रूप से, परिसंपत्ति()अनुरोध पर निर्भर करता है सेवा अपनी संपत्ति (यह पता करने के लिए आप वेब साइट के लिए आधार मार्ग है क्या जरूरत है या यदि आप पूर्ण संपत्ति यूआरएल का उपयोग डोमेन नाम क्या है करने के लिए यूआरएल उत्पन्न करने के लिए , उदाहरण के लिए)।

लेकिन जब आप कमांड लाइन से अपना आवेदन चलाते हैं तो अनुरोध नहीं है।

एक तरीका यह तय करने के लिए यह स्पष्ट रूप इस तरह config.yml में अपनी संपत्ति के लिए आधार यूआरएल को परिभाषित करने के:

framework: 
    templating: 
    assets_base_urls: { http: ["http://yoursite.com"], ssl: ["http://yoursite.com"] } 

यह दोनों http और ssl परिभाषित करने के लिए महत्वपूर्ण है, क्योंकि अगर आप को छोड़ देते हैं उनमें से एक संपत्ति() अभी भी अनुरोध सेवा पर निर्भर करेगा।

(संभव) नकारात्मक पक्ष यह है कि संपत्ति के सभी यूआरएल अब पूर्ण होंगे।

+0

धन्यवाद आपके स्पष्ट स्पष्टीकरण और आपके समाधान के लिए, यह पूरी तरह से काम करता है! मैंने इस समाधान से पहले कोशिश की http://symfony.com/doc/current/cookbook/console/sending_emails.html लेकिन सफलता के बिना –

+0

इस समाधान के साथ, सभी संपत्तियां एक पूर्ण यूआरएल का उपयोग करती हैं। यह कभी-कभी एक समस्या हो सकती है। – ke20

+0

यह समाधान केवल तभी काम कर रहा है जब http url और ssl url बिल्कुल वही हैं। –

1

BetaRide के उत्तर के बाद मुझे सही रास्ते पर रखा गया लेकिन यह पर्याप्त नहीं था। फिर यह शिकायत कर रहा था: "नामित मार्ग के लिए यूआरएल उत्पन्न करने में असमर्थ" क्योंकि इस तरह का मार्ग मौजूद नहीं है। "

एक वैध अनुरोध मैं बहुत तरह परियोजना की जड़ का अनुरोध करने के लिए इसे संशोधित कर लिया है बनाने के लिए: (? सुरक्षित जड़)

$request = new Request(); 
$request->create('/'); 
$this->container->enterScope('request'); 
$this->container->set('request', $request, 'request'); 

आप एक अलग मार्ग कॉल करने के लिए आवश्यकता हो सकती है, जड़ सिर्फ मेरे लिए काम किया ठीक।

Symfony2 Docs

बोनस अलावा:

मैं Symfony2 के माध्यम से CLI में इतना templating/मार्ग करना पड़ा आदेश है कि मैं AppKernel में initializeContainer() विधि नवीनीकृत किया है। यह साइट के रूट के लिए एक मार्ग बनाता है, रूटर संदर्भ सेट करता है और उपयोगकर्ता लॉगिन नकली:

protected function initializeContainer() 
{ 
    parent::initializeContainer(); 
    if (PHP_SAPI == 'cli') { 

     $container = $this->getContainer(); 

     /** 
     * Fake request to home page for cli router. 
     * Need to set router base url to request uri because when request object 
     * is created it perceives the "/portal" part as path info only, not base 
     * url and thus router will not include it in the generated url's. 
     */ 
     $request = Request::create($container->getParameter('domain')); 
     $container->enterScope('request'); 
     $container->set('request', $request, 'request'); 
     $context = new RequestContext(); 
     $context->fromRequest($request); 
     $container->get('router')->setContext($context); 
     $container->get('router')->getContext()->setBaseUrl($request->getRequestUri()); 

     /** 
     * Fake admin user login for cli. Try database read, 
     * gracefully print error message if failed and continue. 
     * Continue mainly for doctrine:fixture:load when db still empty. 
     */ 
     try { 
      $user = $container->get('fos_user.user_manager')->findUserByUsername('admin'); 
      if ($user !== null) { 
       $token = $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles()); 
       $this->getContainer()->get('security.token_storage')->setToken($token); 
      } 
     } catch (\Exception $e) { 
      echo "Fake Admin user login failed.\n"; 
     } 
    } 
} 

आप पिछले $container->get('router')->getContext()->setBaseUrl($request->getRequestUri()); भाग की जरूरत नहीं है, लेकिन मैं यह करने के क्योंकि मेरी साइट रूट डोमेन पर था .com/siteroot/और राउटर यूआरएल पीढ़ी के लिए अलग/siteroot/दूर था।

+0

एफवाईआई: इसे हटा दिया गया था और सिम्फनी 3 में हटा दिया गया था, और सेवा स्तर पर "सेटस्कोप" के साथ प्रतिस्थापित किया गया था: https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#dependencyinjection – Rvanlaak

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