En este artículo vamos ver cómo podemos crear tareas programadas dentro de nuestros proyectos Symfony. Como ejemplo, vamos a crear un comando que se ejecutará como tarea programada con el fin de enviar diariamente una relación de los comentarios que están sin publicar en nuestro blog.
Symfony2 incluye un magnífico componente, el componente de consola, gracias al cual podemos crear comandos de línea de comandos que podemos utilizar tanto para tareas programadas como para cualquier tarea repetitiva como una importación o cualquier otro trabajo por lotes.
Crear un comando en Symfony2 es extremadamente fácil, solo necesitamos crear una carpeta Command en un bundle de nuestro proyecto y dentro de ella, un archivo con el sufijo Command.php por cada comando que queramos crear.
En nuestro ejemplo, necesitaremos además tener acceso al contenedor de servicios para poder recuperar los servicios doctrine o mailer, por lo que extenderemos de la clase ContainerAwareCommand en lugar de Command.
Por tanto, crearemos el fichero BlogComentariosCommand.php dentro de la carpeta Command de nuestro bundle Blog, añadiendo el siguiente código:
<?php
namespace VabadusBlogBundleCommand;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class BlogComentariosCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('vabadus:blog:comentarios')
->setDescription('Envía por correo electrónico comentarios sin publicar')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$em = $this->getContainer()->get('doctrine')->getManager();
$comentarios = $em->getRepository('BlogBundle:Comentario')
->findBy(array('publicado' => 0));
$texto_mail = "";
foreach ($comentarios as $comentario) {
$texto_mail .= $comentario->getTitle()."\r\n";
}
$mensaje = \Swift_Message::newInstance()
->setSubject("Comentarios despublicados")
->setFrom("hola@vabadus.es")
->setTo("admin@vabadus.es")
->setBody($texto_mail);
$this->getContainer()->get('mailer')->send($mensaje);
}
}
Hecho esto, si nos vamos a la línea de comandos y ejecutamos lo siguiente para mostrar todos los comandos disponibles:
$ php app/console
veremos que ya aparece nuestro comando en el listado
En este punto, solo nos quedaría configurar la tarea programada en nuestro servidor, incluyéndola en el crontab para que, por ejemplo, se ejecutase todos los días a las 6 de la mañana:
0 6 * * * php /path/a/nuestro/proyecto/Symfony/app/console vabadus:blog:comentarios