En esta sección, con un ejemplo de código breve mostraremos como administrar la subida de archivo con un método de acción en el controlador. Atraeremos la atención del lector a los aspectos específicos de la subida de archivos.
Supongamos que queremos agregar una página web que muestre un formulario
(llamémoslo YourForm
) capaz de subir archivos. Para esta página, necesitamos
agregar el método uploadAction()
a la clase controladora:
<?php
//...
class IndexController extends AbstractActionController
{
// This is the "upload" action displaying the Upload page.
public function uploadAction()
{
// Create the form model.
$form = new YourForm();
// Check if user has submitted the form.
if($this->getRequest()->isPost()) {
// Make certain to merge the files info!
$request = $this->getRequest();
$data = array_merge_recursive(
$request->getPost()->toArray(),
$request->getFiles()->toArray()
);
// Pass data to form.
$form->setData($data);
// Execute file validators.
if($form->isValid()) {
// Execute file filters.
$data = $form->getData();
// Redirect the user to another page.
return $this->redirect()->toRoute('application', ['action'=>'index']);
}
}
// Render the page.
return new ViewModel([
'form' => $form
]);
}
}
Como podemos ver en el código de arriba, el método uploadAction()
tiene el aspecto
usual de una acción de controlador que implementa el flujo de trabajo típico,
sin embargo el método tiene algunos aspectos específicos para cargar archivos
(estos aspectos se marcan en negritas):
En la línea 9, creamos una instancia del modelo de formulario YourForm
con
la ayuda del operador new
.
En la línea 12, revisamos si la petición es una petición HTTP POST. Si es así,
traemos los datos de los arreglos super-globales de PHP $_POST
y $_FILES
y los unimos en un solo arreglo (líneas 15-19). Esto es necesario para gestionar
correctamente los archivos subidos. Luego pasamos este arreglo al modelo del
formulario con el método setData()
(línea 22).
En la línea 25, llamamos al método del modelo de formulario isValid()
.
Este método ejecuta el filtro de entradas asociado al modelo de formulario.
Para las entradas de la clase FileInput
solo se ejecutarán los validadores
asociados.
Si los datos son validos, llamamos al método getData()
(línea 28). Para los
campos de la clase FileInput
, este método ejecutará los filtros de archivo
asociados. Los filtros de archivos, por ejemplo, podrían mover los archivos
subidos a la carpeta de destino.
En caso de éxito, en la línea 31, dirigimos al usuario a la acción «index» del controlador.
Arriba, en la acción del controlador debemos recordar tres cosas: 1) unir los arreglos super-globales
$_POST
y$_FILES
antes de pasarlos al método del formulariosetData()
; 2) usar el método del formularioisValid()
para revisar la corrección de los archivos subidos (ejecutar validadores); 3) usar el método del formulariogetData()
para ejecutar los filtros.