Symfony: cómo montar un programador de tareas en menos de 1 hora

2017-11-21 - Categorías: PHP / Symfony
Symfony logo

Cuando has valorado bien un proyecto, y es tal el nivel de personalización que se quiere alcanzar, no queda más remedio que hacer un desarrollo artesanal, o a la larga te arrepentirás. Ya que partir de un CMS prefabricado es, a veces, más que una ayuda un lastre. Cuando quieres la máxima flexibilidad, velocidad en las modificaciones.. y por supuesto, la máxima calidad.. tienes que ir al desarrollo sobre frameworks. Ya hablé sobre esto en otro post anterior..

Hoy vengo a empezar con una serie de plugins o bundles para Symfony, hoy con uno para programar tareas. Ya sea para enviar emails transaccionales, para programar tareas de marketing, crawleos de sitios web, generar sitemaps, o lo que sea que quieras automatizar.. Aquí verás como en un rato tienes montado un estupendo programador de tareas.

Con este programador de tareas ya tienes el panel de control hecho. Es decir, te evitas la construcción del panel, y podrás ir al siguiente paso en menos de una hora. Que será directamente el ir a crear las tareas tal y como las necesites para tu proyecto 🙂

Comenzando

Partimos de un proyecto en Symfony estándar. He probado, y recomiendo, ya que funciona muy bien, el jmose/command-scheduler-bundle, así que ejecutamos desde línea de comandos:

$ composer require jmose/command-scheduler-bundle

Añadimos al núcleo de Symfony el bundle para poder usarlo en app/AppKernel.php:

new JMose\CommandSchedulerBundle\JMoseCommandSchedulerBundle(),

Nos queda añadir en el fichero routing.yml las entrada de las rutas del programador de tareas:

jmose_command_scheduler:
    resource: "@JMoseCommandSchedulerBundle/Resources/config/routing.yml"
    prefix: /

Actualizamos la base de datos para que el bundle guarde sus datos sobre las tareas programadas:

$ php app/console doctrine:schema:update --dump-sql --force

Ahora tenemos que engancharlo al sistema operativo programando a cada minuto el siguiente comando. En el crontab del sistema ponemos:

* * * * * php /directorio/de/tu/proyecto/app/console scheduler:execute

Ya está, lo tenemos, listo para usarlo. Esto es menos de una hora, así que vamos un poco a personalizarlo 😉

Personalizándolo

Lo primero que tienes que poner es un enlace en algún sitio de tu proyecto al listado de tareas programadas. En el fichero de arriba (routing.yml) tienes todas las rutas que nos proporciona este plugin. Pero la principal, que es el listado que está en la ruta llamada jmose_command_scheduler_list. Así que ponemos en el menú o en otro sitio, un enlace así:

<a href="{{ path('jmose_command_scheduler_list') }}>Cronjobs</a>

En un proyecto de ejemplo se ve tal que así el listado de tareas:

Gestor de tareas programadas para Symfony

Podemos parar o arrancar tareas, elegir fichero de registro, las horas, minutos, días de la semana, mes, etc.. Si entramos a editar o crear una tarea programada veremos que sólo necesitamos crear un comando de consola, y ya lo tendremos listo en el programador de tareas para decirle en qué momentos se tiene que ejecutar.

Gestor de tareas programadas para Symfony2

Para que se vea así, tenemos que personalizar las plantillas. Siguiendo la forma estándar de Syfmony para esto, no tenemos nada más que copiar el directorio vendor/jmose/command-scheduler-bundle/Resources/views/ y todo su contenido en el directorio app/Resources/JMoseCommandSchedulerBundle/views/ y a personalizar..

¿A que no tiene nada que envidiar a los programadores de tareas de Magento o Prestashop?

Ya sólo me queda dejar el enlace a la página web del proyecto: https://github.com/J-Mose/CommandSchedulerBundle

2 respuestas a “Symfony: cómo montar un programador de tareas en menos de 1 hora”

  1. Otoniel dice:

    Como es que agregas un comando personalizado para que me ejecute un metodo de mi controlador?

    • Jnj dice:

      Hola Otoniel!

      En ese caso, deberías de hacer el método del controlador una función pública. Por otro lado crear un comando de consola que simplemente llame a esa función pública del controlador. Y entonces dicho comando puedes ponerlo como tarea programada en JMoseSchedulerBundle.

      Lo ideal sería incluso hacer un servicio que contenga esta función. Y así esta función la llamas desde el controlador, o desde el comando de consola. Ten en cuenta que sólo los comandos de consola se pueden programar en el JMoseSchedulerBundle. Así que si quieres usar JMoseSchedulerBundle hay que hacer un comando de consola siempre.

      Saludos.

Responder a Jnj Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

 

© 2024 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.