Lo que vamos a hacer en este capítulo es darle el control de nuestras rutas al controlador, ya que éste viene a ser el cerebro de nuestra aplicación. A partir de este capítulo todo va a ser más sencillo.
Lo que vamos a hacer es, dentro de la carpeta app vamos a definir una nueva carpeta al que le vamos a dar el nombre Controllers, que es la carpeta donde vamos a definir nuestros controladores, dentro de esta carpeta app también vamos a crear la carpeta Models, que guarda nuestros modelos.
Hasta ahora el esquema con todas las carpetas y archivos que hemos creado es el siguiente:
- app
- lib
- public
- css
- img
- js
- .htaccess
- index.php
- routes
- .htaccess
- autoload.php
En total 15 entre archivos y carpetas
Lo que necesitamos es crear un controlador para la ruta principal, un controlador para la ruta contact, about...
Controlador de la ruta principal
El primer controlador que vamos a crear es el de la ruta principal, al que vamos a llamar HomeController.php y lo vamos a incluir dentro de la carpeta Controllers, y que va a tener la siguiente sintaxis.
Controllers/HomeController.php
<?php
namespace App\Controllers;
class HomeController {
public function index(){
// Método que se encarga de incluir toda la lógica necesaria para mostrar contenido
return "Hola desde la página de inicio";
}
}
Y también vamos a modificar Route.php.
Route.php
<?php
namespace Lib;
class Route
{
private static $routes = [];
// Método encargado de agregar rutas GET
public static function get($uri, $callback){
$uri = trim($uri, "/");
self::$routes['GET'][$uri] = $callback;
}
// Método encargado de agregar rutas POST
public static function post($uri, $callback){
$uri = trim($uri, "/");
self::$routes['POST'][$uri] = $callback;
}
// Método para recuperar la URI y el método
public static function dispatch() {
$uri = $_SERVER['REQUEST_URI'];
$uri = trim($uri, "/");
// Variable que nos mostrará el método que hemos utilizado
$method = $_SERVER['REQUEST_METHOD'];
foreach(self::$routes[$method] as $route => $callback){
if(strpos($route, ':') !== false){
$route = preg_replace('#:[a-zA-Z]+#', '([a-zA-Z]+)', $route,);
}
if(preg_match("#^$route$#", $uri , $matches)){
$params = array_slice($matches, 1);
// $response = $callback(...$params);
if(is_callable($callback)){
$response = $callback(...$params);
}
if(is_array($callback)){
$controller = new $callback[0];
$response = $controller->{$callback[1]}(...$params);
}
if(is_array($response) || is_object($response)){
header('Content-Type: application/json');
echo json_encode($response);
} else {
echo $response;
}
return;
}
}
echo "404 Not Found";
}
}
El próximo paso que veremos es como traer una vista, la cual viene a ser los documentos HTML que queramos mostrar en nuestra página.