Aprende a renderizar una vista Twig dentro de un comando en tu proyecto Symfony 5.


Twig es sin duda uno de los mejores motores de plantillas para PHP que puedes encontrar hoy en día. Viene incluido en un entorno estándar de Symfony 5 y se puede usar en todas partes, sin embargo en la documentación oficial es bastante difícil identificar un ejemplo útil de cómo usar el motor de plantillas fuera de los controladores, específicamente dentro de un comando. Los comandos se crean con el propósito específico de ejecutar tareas intensivas en memoria que no deberían ejecutarse a través de una solicitud en el navegador, por ejemplo, servicios de remitentes de correo electrónico masivo.

El uso más típico del motor de plantillas dentro de un comando es representar la plantilla de correo electrónico de forma dinámica. En este artículo, te explicaremos cómo solicitar el servicio del motor de plantillas dentro de un comando de Symfony o cómo trabajar con un entorno Twig aislado.

A. Uso del entorno del proyecto

De forma predeterminada, probablemente querrá seguir con el entorno Twig configurado ya en su proyecto, por lo que tendrá acceso a los métodos de enrutamiento ( {{ path("some_route") }}) y la variable de la aplicación en la vista. Esta es la forma más fácil de proceder también en comparación con la opción de un entorno aislado, simplemente necesitará importar el espacio de nombres Twig\Environment e inyectar la clase en el constructor, exponiéndola a la clase a través de una variable privada. Entonces podrá llamar al método render desde la variable $this->twig en la clase como se muestra en el siguiente ejemplo:

<?php

// src/Command/MyCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

// Importar el entorno Twig
use Twig\Environment;

class MyCommand extends Command
{
    // el nombre del comando (la parte después de "bin/console")
    protected static $defaultName = 'app:my-command';
    
    // Crea una variable privada para almacenar el entorno twig
    private $twig;

    public function __construct(Environment $twig)
    {
        // Inyectarlo en el constructor y actualizar el valor en la clase.
        $this->twig = $twig;

        parent::__construct();
    }
    
    protected function configure(){}

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // Renderiza alguna plantilla dentro de project/templates/emails/example.html.twig
        $html = $this->twig->render('emails/example.html.twig', [
            'someVariable' => 123
        ]);

        // Vista previa de HTML en la terminal
        $output->writeln($html);
        
        return 0;
    }
}

B. Usando un ambiente aislado

Ahora, si desea trabajar con un entorno Twig totalmente nuevo, deberá seguir algunos pasos adicionales. Debe considerar que trabajar con esta opción, como se mencionó, es como trabajar con un entorno Twig que no tiene nada que ver con su proyecto en sí, ya que no tendrá acceso al enrutamiento, etc. Como primero, cree un servicio llamado Twig que se cargará con el directorio raíz de su proyecto:

<?php
// src/Service/Twig.php
namespace App\Service;

use Symfony\Component\HttpKernel\KernelInterface;
use Twig\Environment;
use Twig\Loader\FilesystemLoader;

class Twig extends Environment {
    
    public function __construct(KernelInterface $kernel) {
        $loader = new FilesystemLoader("templates", $kernel->getProjectDir());
        
        parent::__construct($loader);
    }
}

Luego, inyectaremos este servicio en el comando a través del constructor y, a diferencia de la primera opción, en lugar de renderizar la plantilla directamente desde el entorno twig, es necesario cargar primero la plantilla y luego llamar al método render, proporcionando los parámetros directamente como primero. argumento (si lo hay):

<?php

// src/Command/MyCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

// Importar el entorno Twig desde el servicio creado
use App\Service\Twig;

class MyCommand extends Command
{
    // el nombre del comando (la parte después de "bin/console")
    protected static $defaultName = 'app:my-command';
    
    // Crea una variable privada para almacenar el entorno twig
    private $twig;

    public function __construct(Twig $twig)
    {
        // Inyectarlo en el constructor y actualizar el valor en la clase.
        $this->twig = $twig;

        parent::__construct();
    }
    
    protected function configure(){}

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // Cargar archivo Twig
        $template = $this->twig->load('emails/example.html.twig');

        // Renderizar HTML
        $html = $template->render([
            'someVariable' => 123
        ]);

        // Vista previa de HTML en la terminal
        $output->writeln($html);
        
        return 0;
    }
}

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores