En primer lugar necesitamos crear el comando symfony que ejecute la funcionalidad que deseamos. Para ello creamos una carpeta llamada Command en nuestro Bundle (al mismo nivel que Controller o Resources) y le pondremos nombre a nuestra clase. El nombre siempre tiene que terminar en Command o no funcionará. Le vamos a llamar MyCommand.
Como podéis ver la clase extiende de ContainerAwareCommand y tiene dos métodos: configure y execute. Extendemos de ContainerAwareCommand ya que de esta manera tenemos acceso al Service Container simplemente haciendo $this->getContainer(). Esto nos servirá para acceder a servicios muy comunes como el Entity Manager o el Mailer.
En cuanto a los métodos en configure definimos el nombre del comando, en nuestro caso devness:my_command (luego explicaré para qué sirve) Como podéis observar en el ejemplo he incluido un argumento llamado "my_argument" de tipo opcional. Si usamos la constante InputArgument::REQUIRED en lugar de InputArgument::OPTIONAL el argumento será obligatorio.
En el método execute es donde llevamos a cabo la tarea. En el código podéis ver algunas cosas típicas que pueden hacerse. Si se tratase del ejemplo que he dado en la introducción sobre enviar un correo-resumen de notificaciones a los usuarios que llevan días sin entrar aquí sería donde accederíamos a la base de datos para averiguar qué usuarios reunen los requisitos para recibir dicho correo y nos encargaríamos de enviarlo. Ahora que ya tenemos nuestro comando nos vamos al directorio donde tenemos nuestro proyecto symfony y lo ejecutamos:
- php app/console devness:mycommand --my_argument=valor
Como en nuestro ejemplo el argumento es opcional podríamos omitirlo:
- php app/console devness:mycommand
Funciona? Perfecto. Ahora necesitamos que esta tarea se ejecute en algún momento determinado del tiempo, normalmente de manera periódica. Para ello usaremos Cron (En sistemas UNIX como Linux o Mac OS X). En este post no pretendo explicar como funciona Cron, ya que con usar un poco a nuestro amigo Google podemos descubrir como funciona. En resumidas cuentas tenemos un archivo de texto llamado crontab que podemos editar en el servidor donde corre la aplicación Symfony mediante el siguiente comando:
- crontab -e
En mi ordenador este comando me abre el crontab con el editor Vim. Yo prefiero nano, por lo que yo lo ejecuto así:
- EDITOR=nano crontab -e
Si queremos que nuestra tarea se ejecute cada minuto escribiríamos la siguiente línea en nuestro crontab
- * * * * * php /Ruta/Absoluta/Hasta/Proyecto/Symfony/app/console devness:mycommand --myargument=valor
- * */2 * * * php /Ruta/Absoluta/Hasta/Proyecto/Symfony/app/console devness:mycommand --myargument=valor