Ver índice de contenidos del libro

13.11. Generando archivos mediante esqueletos

Otro de los usos comunes de las tareas es la generación de archivos, que se realiza mediante esqueletos y el método sfFilesystem::replaceTokens(). Como su propio nombre sugiere, este método reemplaza tokens dentro de un conjunto de archivos. Si se le pasa un array con los archivos y una lista de tokens, reemplaza todas las apariciones de cada token en todos los archivos por su correspondiente valor.

Para comprender mejor la utilidad de este método, vamos a reescribir de forma parcial una tarea existente llamada generate:module. Para simplificar el ejemplo, sólo nos vamos a fijar en el método execute() de esta tarea, por lo que suponemos que se ha configurado correctamente con todas las opciones necesarias. También nos vamos a olvidar de la validación.

Antes de crear la tarea, es necesario crear el esqueleto de los archivos y directorios que se van a crear, definiéndolos por ejemplo dentro del directorio data/skeleton/:

data/skeleton/
  module/
    actions/
      actions.class.php
    templates/

El esqueleto de actions.class.php debería tener el siguiente aspecto:

class %moduleName%Actions extends %baseActionsClass%
{
}

El primer paso de nuestra tarea consiste en copiar toda la estructura de archivos y directorios en el lugar que corresponda:

$moduleDir = sfConfig::get('sf_app_module_dir').$options['module'];
$finder    = sfFinder::type('any');
$this->getFilesystem()->mirror(sfConfig::get('sf_data_dir').'/skeleton/module', $moduleDir, $finder);

Ahora ya es posible reemplazar los tokens del archivo actions.class.php:

$tokens = array(
  'moduleName'       => $options['module'],
  'baseActionsClass' => $options['base-class'],
);
 
$finder = sfFinder::type('file');
$this->getFilesystem()->replaceTokens($finder->in($moduleDir), '%', '%', $tokens);

¡Y esto es todo! Ya hemos creado nuestro nuevo módulo y lo hemos personalizado mediante el reemplazo de tokens.

Nota La tarea generate:module de Symfony busca realmente en el directorio data/skeleton/ por si el programador ha definido algún esqueleto propio, así que cuidado con los cambios que realices.