Como podemos recordar, los filtros y validadores que están asociados a un modelo
de formulario se guardan generalmente en el contenedor
InputFilter
que consiste
de entradas (una entrada se representa generalmente con la clase Input
que
pertenece al espacio de nombres Zend\InputFilter
). Con los campos comunes de
un formulario, los filtros se ejecutan antes que los validadores y los
validadores se ejecutan después de los filtros.
Sin embargo, con los archivos subidos existen algunas importantes diferencias:
FileInput
en lugar de la clase Input
.Para almacenar las reglas de validación para los archivos que se suben debemos
usar la clase FileInput
en lugar de la acostumbrada clase Input
.
En nuestro método privado addInputFilter()
del modelo de formulario, agregamos
las reglas de validación para la entrada del archivo de la siguiente manera:
$inputFilter->add([
'type' => 'Zend\InputFilter\FileInput',
'name' => 'file', // Element's name.
'required' => true, // Whether the field is required.
'filters' => [ // Filters.
// Put filter info here.
],
'validators' => [ // Validators.
// Put validator info here.
]
]);
Arriba, colocamos la llave «type» (línea 2) con el nombre de la clase Zend\InputFilter\FileInput
como valor. El resto de llaves es análogo a las que usamos antes cuando agregamos
reglas de validación para el modelo de formulario.
El comportamiento de la clase FileInput
es diferente del comportamiento de la
clase Input
en los siguientes aspectos:
Ella espera que los datos que se le pasan como entrada estén en el formato del
arreglo $_FILES
(un arreglo con las llaves tmp_name
, error
, type
, etc).
Un validador Zend\Validator\File\Upload
se inserta automáticamente en la
cadena de validación de entradas antes de todos los otros validadores.
Los validadores insertados en la cadena de validación de entradas se ejecutan
antes que los filtros insertados en la cadena de filtros. Este comportamiento
es opuesto al de la clase Input
.
Para los campos usuales de un formulario, los filtros se ejecutan generalmente antes que los validadores y los validadores se ejecutan después que los filtros. Sin embargo, para los archivos que se han subido este orden se invierte.
Para los archivos subidos, los validadores se ejecutan antes que los filtros. Este comportamiento es inverso al comportamiento usual.
Cuando trabajamos con archivos que se han subido, primero necesitamos revisar que
los datos que se extraen del arreglo super-global $_FILES
son correctos, para
luego hacer cualquier cosa con los archivos (mover el archivo a una carpeta,
renombrarlo, etc.). Por esto, los validadores de archivo se deben ejecutar
primero y los filtros en segundo lugar.
Para ver como se ejecuta este proceso recordemos el flujo de trabajo típico para un formulario:
setData()
para llenar el formulario con datos.isValid()
para ejecutar los filtros y validadores que
están en el filtro de entradas asociado al formulario.getData()
para extraer los
datos filtrados y validados del filtro de entradas asociado al formulario.getMessages()
para recuperar los
mensajes de error de la validación.Cuando usamos la clase para entradas FileInput
el flujo de trabajo es el mismo.
Sin embargo es importante entender lo que sucede en cada uno de estos pasos.
setData()
para llenar el formulario con los datos.isValid()
para ejecutar los validadores que están en
el filtro de entradas asociado al formulario.getData()
para ejecutar los
filtros y extraer los datos filtrados y validados del filtro de entradas
asociado al formulario.getMessages()
para recuperar los
mensajes de error de la validación.Nótese que con la clase para entradas
FileInput
los filtros asociados solo se ejecutan si se llama al métodogetData()
.
Cuando usamos ambas clases para entradas, Input
y FileInput
, en nuestro
filtro de entradas de formulario (que es el caso común), los filtros aún se
ejecutan primero para las entradas comunes pero los validadores se ejecutan
primero para las entradas de archivo.