51. Controladores en PHP

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
    • Controllers
    • Models
  • lib
    • Route.php
  • public
    • css
    • img
    • js
    • .htaccess
    • index.php
  • routes
    • web.php
  • .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.