2015-06-29 21 views
7

Jak mogę użyć $ this-> renderView wewnątrz komendy symfony (nie wewnątrz kontrolera)? Mam nowe informacje na temat funkcji "renderView", ale co muszę skonfigurować, aby użyć jej z poleceniem?RenderView w użyciu Symfony Command

góry dziękuję an pozdrowienia

Odpowiedz

17

Twoja klasa polecenie musi rozszerza ContainerAwareCommandabstract class a następnie można zrobić:

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

Kiedy przychodzi do poleceń, które rozciągają ContainerAwareCommand właściwy sposób, aby uzyskać pojemnik jest przez getContainer() w przeciwieństwie do skrótu kontrolera.

+0

Dziękuję, tak to działa idealnie. Cóż, dziękuję za odpowiedź !! – TheTom

+0

Kolejne pytanie dotyczące polecenia: Jak uzyskać dostęp do security.content w poleceniu? $ user = $ this-> get ('security.context') -> getToken() -> getUser(); to nie zadziała, więc utknąłem ponownie :( – TheTom

+0

Może dlatego, że '$ this-> get ('security.context') -> getToken() === null' – mykiwi

0

W Symfony 4 Nie mogłem uzyskać $this->getContainer()->get('templating')->render($view, $parameters); do pracy.

ustawić stosowanie nazw dla Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand i rozszerzony ContainerAwareCommand class EmailCommand extends ContainerAwareCommand

uzyskać wyjątek rzucony

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

Dla Symfony 4, jest to rozwiązanie wymyśliłem.

Najpierw zainstalowałem gałązkę.

composer require twig 

Następnie stworzyłem własną usługę gałązki.

<?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); 
    } 
} 

Teraz moje polecenie e-mail wygląda tak.

<?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

Ponieważ usługi są domyślnie prywatne, dlatego zostały usunięte podczas procesu kompilacji kontenerów, dlatego nie są dostępne później. Możesz to sprawdzić, uruchamiając 'debug: container Możesz wstawić 'EngineInterface' zamiast tego, a skończysz z automatycznie podłączonym Twigiem –

+0

@Mike czy istnieje sposób na zrobienie podstawowych usług, domyślnie niedostępnych dla konsoli, dostępne? Edytuj (właśnie cię widziałem rozwiązanie) –

+0

Masz na myśli publiczne upublicznianie usług? Jasne, po prostu deklaruj je publicznie c] (https://symfony.com/blog/new-in-symfony-3-4-services-are-private-by-default) w twoim 'services.yml' lub innym. –