2015-06-29 21 views
7

Come posso utilizzare $ this-> renderView all'interno di un comando symfony (non all'interno di un controller)? Sono nuovo sulla funzione "renderView" ma cosa devo impostare per usarlo con un comando?RenderView in Symfony Utilizzo comandi

Grazie in anticipo un riguardi

risposta

17

vostro must classe di comando estende il ContainerAwareCommandabstract class e quindi si può fare:

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

Quando si tratta di comandi che si estendono ContainerAwareCommand il modo corretto per ottenere il contenitore è di getContainer() a differenza della scorciatoia del controller.

+0

Grazie, è così che funziona perfettamente. Bene, grazie per la tua risposta !! – TheTom

+0

Solo un'altra domanda sul comando: come posso accedere a security.content in un comando? $ user = $ this-> get ('security.context') -> getToken() -> getUser(); questo non funzionerà quindi mi sono bloccato di nuovo :( – TheTom

+0

Forse perché '$ this-> get ('security.context') -> getToken() === null' – mykiwi

0

In Symfony 4 non sono riuscito a far funzionare $this->getContainer()->get('templating')->render($view, $parameters);.

ho impostato l'uso dello spazio dei nomi per Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand ed esteso ContainerAwareCommand class EmailCommand extends ContainerAwareCommand

ottengo un eccezione generata

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

Per Symfony 4, questa è la soluzione mi è venuta.

Prima ho installato Twig.

composer require twig 

poi creato il mio proprio servizio ramoscello.

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

Ora il mio comando di posta elettronica è simile a questo.

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

Poiché i servizi sono privati ​​per impostazione predefinita, il significato è rimosso durante il processo di compilazione del contenitore quindi non disponibile successivamente. Puoi verificarlo eseguendo 'debug: container il comando templating.Potresti inserire "EngineInterface" invece e verrai automaticamente collegato a Twig. –

+0

@Mike c'è un modo per rendere disponibili i servizi di base, per impostazione predefinita non disponibili alla console? Modifica (ti ho appena visto soluzione) –

+0

Vuoi dire rendere pubblici i servizi privati? Certo, solo [dichiarali pubblici c] (https://symfony.com/blog/new-in-symfony-3-4-services-are-private-by-default) nel tuo 'services.yml' o simile. –