CREAR CONTROLADORES EN SLIM PHP: GUÍA PRÁCTICA
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()
{
...
});
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);
};
Espero que os haya servido.