2015-06-29 8 views
7

मैं इस सिमफ़ोनी कमांड (नियंत्रक के अंदर नहीं) के अंदर $-- प्रस्तुत करना कैसे उपयोग कर सकता हूं? मैं फ़ंक्शन "रेंडर व्यू" के बारे में नया हूं, लेकिन मुझे इसे कमांड के उपयोग के लिए सेटअप करने के लिए क्या करना है?सिम्फनी कमांड उपयोग में रेंडरव्यू

अग्रिम धन्यवाद एक संबंध है

उत्तर

17

आपका आदेश वर्ग चाहिए ContainerAwareCommandabstract class प्रदान करता है और उसके बाद आप कर सकते हैं:

$this->getContainer()->get('templating')->render($view, $parameters); 

यह आदेश प्राप्त करने के लिए कंटेनर ContainerAwareCommand उचित तरीके से विस्तार करने के लिए आता है नियंत्रक शॉर्टकट के विपरीत getContainer() है।

+0

धन्यवाद, यह पूरी तरह से काम करता है। खैर, आपके उत्तर के लिए धन्यवाद !! – TheTom

+0

कमांड के बारे में सिर्फ एक और प्रश्न: मैं कमांड में सुरक्षा.content कैसे एक्सेस कर सकता हूं? $ उपयोगकर्ता = $ यह-> प्राप्त करें ('security.context') -> getToken() -> getUser(); यह काम नहीं करेगा इसलिए मैं फिर से अटक गया :( – TheTom

+0

शायद क्योंकि '$ this-> प्राप्त करें (' security.context ') -> getToken() === null' – mykiwi

0

सिम्फनी 4 में मुझे $this->getContainer()->get('templating')->render($view, $parameters); काम करने के लिए नहीं मिला।

मैं Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand के लिए नाम स्थान उपयोग की स्थापना की और ContainerAwareCommand class EmailCommand extends ContainerAwareCommand

बढ़ाया मैं एक अपवाद फेंका

[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException] 
     You have requested a non-existent service "templating". 

Symfony 4 के लिए मिलता है, यह समाधान मैं के साथ आया है।

सबसे पहले मैंने ट्विग स्थापित किया।

composer require twig 

फिर अपनी खुद की जुड़वां सेवा बनाई।

<?php 

# src/Service/Twig.php 

namespace App\Service; 

use Symfony\Component\HttpKernel\KernelInterface; 

class Twig extends \Twig_Environment { 

    public function __construct(KernelInterface $kernel) { 
     $loader = new \Twig_Loader_Filesystem($kernel->getProjectDir()); 

     parent::__construct($loader); 
    } 
} 

अब मेरा ईमेल कमांड इस तरह दिखता है।

<?php 

# src/Command/EmailCommand.php 

namespace App\Command; 

use Symfony\Component\Console\Command\Command, 
    Symfony\Component\Console\Input\InputInterface, 
    Symfony\Component\Console\Output\OutputInterface, 
    App\Service\Twig; 

class EmailCommand extends Command { 

    protected static $defaultName = 'mybot:email'; 

    private $mailer, 
      $twig; 

    public function __construct(\Swift_Mailer $mailer, Twig $twig) { 
     $this->mailer = $mailer; 
     $this->twig = $twig; 

     parent::__construct(); 
    } 

    protected function configure() { 
     $this->setDescription('Email bot.'); 
    } 

    protected function execute(InputInterface $input, OutputInterface $output) { 

     $template = $this->twig->load('templates/email.html.twig'); 

     $message = (new \Swift_Message('Hello Email')) 
      ->setFrom('[email protected]') 
      ->setTo('[email protected]') 
      ->setBody(
       $template->render(['name' => 'Fabien']), 
       'text/html' 
      ); 

     $this->mailer->send($message); 
    } 
} 
+0

क्योंकि सेवाओं डिफ़ॉल्ट रूप से निजी कंटेनर संकलन की प्रक्रिया के दौरान इस प्रकार हटाया जिसका अर्थ है कि उपलब्ध नहीं बाद में आप चल 'डिबग कर इसकी पुष्टि कर सकते हैं templating' आदेश। आप 'EngineInterface' बजाय इंजेक्षन सकता है और आप अंत होगा टहनी के साथ स्वचालित रूप से वायर्ड। –

+0

@Mike वहाँ मुख्य सेवाओं बनाने के लिए एक तरह से सांत्वना के लिए उपलब्ध, उपलब्ध नहीं है, डिफ़ॉल्ट रूप से? संपादित करें (केवल आपके देखा समाधान) –

+0

क्या आपका मतलब निजी सेवाएं सार्वजनिक करना है? ज़रूर, बस [उन्हें प्रकाशित करें सी] (https://symfony.com/blog/new-in-symfony-3-4-services-are-private-by-default) आपकी 'services.yml' या ऐसे में)। –

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