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.