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.