Blog de Gonzalo

CREAR CONTROLADORES EN SLIM

Hace poco tuve que hacer una pequeña aplicación con slim y tenía que seguir el patrón MVC. Estuve un buen rato investigando como hacer controladores con slim y todos los ejemplos que veía eran de la siguiente manera:


Route::get("/view", function()
{
   ...
});

Y yo lo que quería era tener mis controladores en otra carpeta específica para los controladores, hasta que al final di con ello y la verdad es que es bastante sencillo.
Lo primero fue tener un archivo settings.php para guardar el array de settings que usa slim, después me cree otro archivo routes.php para tener todas las rutas que iba a usar slim y por último me cree otro fichero llamado dependencies.php donde iba a tener el array container que usa slim.
Para seguir el patrón MVC me cree mi carpeta controller con sus clases y métodos.
Los ficheros más importantes para ésto son el fichero routes.php y el fichero dependencies.php. Voy a poner un ejemplo básico de los dos para un controlador en concreto, ya que es bastante fácil:
Fichero routes.php

$app->get('/productos[/{params:.*}]','ProductosController:showAction');

En ejemplo anterior se ve que la ruta usa el GET ya que vamos a recuperar productos, y luego tenemos [/{nombre:.*}] que indica que el parámetro nombre es opcional (por los corchetes []) si no tuviera los corchetes [] el parámetro nombre sería obligatorio.
Entonces en la ruta "/productos" puede devolver todos los productos o uno en concreto definido por su nombre. Con el parámetro 'ProductosController:showAction' se le indica a slim que llame al método showAction de la case ProductosController.
En mis primeras pruebas tenía puesto la ruta $app->get('/productos[/{params:.*}]','ProductosController::showAction'); donde puse dos veces los dos puntos y lo curioso es que me funcionaba. Me llamaba al método showAction pero no sé como lo hacía slim por debajo que instanciaba el objeto sin pasar por el constructor, ojo el método es public no static. Así que necesitaba que se instanciase el objeto y se llamase al constructor para cargar unas inicializaciones y me di cuenta que sobraban dos puntos.
Y para que slim sepa donde está la clase ProductosController, se lo he indicado en el fichero dependencies.php Fichero dependencies.php

$container = $app->getContainer();
$container['ProductosController'] = function($c)
{
	return new \App\Controllers\ProductosController($c);
};

Como veis se le indica donde se encuentra mi controlador (usando namespaces) y la slim sabe donde tiene que ir a buscarlo e instanciarlo.
Espero que os haya servido.

Compartir en twitter