Más con Symfony

3.1. Empieza más rápido: personalizando la creación de proyectos

Gracias a la línea de comandos de Symfony, crear un proyecto nuevo es tan sencillo como lo siguiente:

$ php /ruta/hasta/symfony generate:project mi_proyecto --orm=Doctrine

La tarea generate:project genera la estructura de directorios por defecto del nuevo proyecto y crea todos los archivos de configuración con los valores iniciales adecuados. Después se puede hacer uso de otras tareas de Symfony para crear aplicaciones, instalar plugins, configurar el modelo, etc.

No obstante, lo primero que haces después de crear cada proyecto seguramente siempre es lo mismo: creas la aplicación principal, instalas varios plugins, modificas el valor de algunas opciones de configuración a tu gusto, etc.

Desde la versión 1.3 de Symfony es posible personalizar y automatizar el proceso de creación de un nuevo proyecto.

Nota Como todas las tareas de Symfony son clases, resulta muy sencillo personalizar su comportamiento mediante la herencia, salvo en el caso de la tarea generate:project. El motivo es que cuando se ejecuta esa tarea todavía no existe ningún proyecto, por lo que no existe una forma sencilla de personalizar su comportamiento.

La tarea generate:project permite el uso de una opción llamada --installer y que indica el nombre del archivo PHP que se ejecuta durante el proceso de creación del proyecto:

$ php /ruta/hasta/symfony generate:project --installer=/donde_sea/mi_instalador.php

El script /donde_sea/mi_instalador.php se ejecuta dentro del contexto de la instancia de sfGenerateProjectTask, por lo que tiene acceso a todos sus métodos (invocándolos a través del objeto $this). Las siguientes secciones muestran todos los métodos disponibles que puedes utilizar para personalizar el proceso de creación de proyectos.

Nota Si en tu archivo de configuración php.ini activas la inclusión de archivos mediante URL en la función include(), puedes incluso utilizar una URL como instalador (obviamente debes tener mucho cuidado en este caso, ya que estás haciendo uso de un script remoto del que puede que no sepas nada):

$ symfony generate:project --installer=http://ejemplo.com/instalador_symfony.php

3.1.1. installDir()

El método installDir() copia una estructura de directorios (compuesta de archivos y subdirectorios) en el nuevo proyecto:

$this->installDir(dirname(__FILE__).'/skeleton');

3.1.2. runTask()

El método runTask() ejecuta una tarea. Como argumento se le pasa el nombre de la tarea y una cadena de texto con todos los argumentos y opciones de esa tarea:

$this->runTask('configure:author', "'Fabien Potencier'");

Las opciones y argumentos de la tarea también se pueden pasar como array:

$this->runTask('configure:author', array('author' => 'Fabien Potencier'));

Truco También se pueden utilizar los nombres cortos de las tareas:

$this->runTask('cc');

Este método se puede utilizar también para instalar plugins:

$this->runTask('plugin:install', 'sfDoctrineGuardPlugin');

Para instalar una versión específica del plugin, simplemente se pasan las opciones adecuadas:

$this->runTask('plugin:install', 'sfDoctrineGuardPlugin', array('release' => '10.0.0', 'stability' => beta'));

Truco Para ejecutar tareas de un plugin recién instalado, es necesario volver a cargar las tareas ejecutando el siguiente código:

$this->reloadTasks();

Si creas una nueva aplicación y quieres utilizar tareas como generate:module que dependen de una aplicación específica, debes modificar el contexto de la configuración manualmente:

$this->setConfiguration($this->createConfiguration('frontend', 'dev'));

3.1.3. Mensajes de log

El script de instalación también puede mostrar fácilmente mensajes de log que indiquen al programador la instalación que se está realizando:

// mensaje de log sencillo
$this->log('mensaje creado por el instalador');

// bloque de mensajes de log
$this->logBlock('Instalador de Fabien', 'ERROR_LARGE');

// sección de mensajes de log
$this->logSection('install', 'instalación de varios archivos');

3.1.4. Interacción con el usuario

Los métodos askConfirmation(), askAndValidate() y ask() permiten realizar preguntas y por tanto convierten la instalación en un proceso configurable de forma dinámica.

Si sólo necesitas una confirmación, utiliza el método askConfirmation():

if (!$this->askConfirmation('¿Seguro que quieres utilizar este instalador?'))
{
  $this->logSection('install', '¡Buena elección!');

  return;
}

También puedes hacer uso del método ask() para preguntar al usuario y obtener su respuesta en forma de cadena de texto:

$secreto = $this->ask('Escribe una cadena de texto única para el secreto de CSRF:');

Y si quieres validar la respuesta, puedes emplear el método askAndValidate():

$validador = new sfValidatorEmail(array(), array('invalid' => '¡Vaya, parece que no es un email!'));
$email = $this->askAndValidate('Por favor, introduce tu email:', $validador);

3.1.5. Operaciones con el sistema de archivos

Si quieres realizar cambios en el sistema de archivos, puedes acceder al objeto de Symfony encargado de estas operaciones:

$this->getFilesystem()->...();

El script de instalación no deja de ser un archivo PHP normal, por lo que puedes hacer cualquier otra cosa que quieras. En lugar de ejecutar las mismas tareas una y otra vez al crear un nuevo proyecto Symfony, puedes utilizar tu propio script para adaptar como quieras la instalación de los proyectos Symfony. Crear un nuevo proyecto con un instalador es mucho más rápido y evita que te olvides de ejecutar algún paso. Además, puedes compartir tu script de instalación con otros programadores.

Nota El el capítulo 6 usaremos un instalador propio. Su código fuente se puede encontrar en el apéndice B.