Cómo construir un sistema básico de enrutamiento del lado del servidor en PHP.

Tomada por Aaron Sekisambu

En el contexto de una aplicación web del lado del servidor, un sistema de enrutamiento es la parte de la aplicación web que asigna una solicitud HTTP a un controlador de solicitud (función / método). Una solicitud HTTP consta de un encabezado y, opcionalmente, un cuerpo. El encabezado contiene información sobre la solicitud, por ejemplo, el método, la ruta y el host. Algunos métodos como GET, HEAD y OPTIONS no hacen uso del cuerpo de la solicitud, mientras que otros como POST, PUT y PATCH lo usan para pasar datos de un cliente a un servidor.

El uso de un sistema de enrutamiento nos permite estructurar nuestra aplicación de una mejor manera en lugar de designar cada solicitud en un archivo.

Un sistema de enrutamiento funciona asignando una solicitud HTTP a un controlador de solicitud en función del método de solicitud y la ruta especificada en la URL de la solicitud. Esto es exactamente lo que vamos a construir en este tutorial.

Requerimientos

  • Necesita PHP versión 5 o superior ejecutándose en su máquina de desarrollo.
  • Conocimientos básicos de PHP, incluida la familiaridad con las variables globales de PHP.
  • Una comprensión de PHP orientado a objetos.

Descargo de responsabilidad.

  • Este enrutador solo manejará las solicitudes GET y POST.
  • No voy a usar herramientas y bibliotecas sofisticadas. Sin compositor, sin carga automática. Quiero mantener el foco en el concepto.
  • Las pruebas unitarias son geniales, pero no voy a hacerlo, con el propósito de mantener este tutorial corto. (Lo siento buenos desarrolladores)
  • El código que voy a escribir no es un código listo para producción.

Vamos a empezar.

Usando el terminal, cree una carpeta para el proyecto y cd en la carpeta.

$ mkdir php-router
$ cd enrutador php

Cree 4 archivos en la carpeta como se muestra a continuación.

$ touch index.php Request.php IRequest.php Router.php

index.php: este es el archivo de entrada para la aplicación web. Aquí es donde inicializaremos el enrutador y definiremos nuestras rutas. También contendrá todas las importaciones.

Request.php: este archivo contendrá una clase para la clase Request para inicializar objetos que contienen información sobre la solicitud HTTP.

IRequest.php: este archivo contendrá la interfaz que la clase Request debe implementar.

Router.php: este archivo contendrá la clase Router.

Antes de escribir el enrutador, debemos diseñar su API (cómo se usará en las aplicaciones). A continuación se muestra la API para nuestro enrutador.

$ router = nuevo enrutador;
// Cómo se definirán las solicitudes GET
$ router-> get ('/ some / route', function ($ request) {
    // El argumento $ request de la devolución de llamada
    // contendrá información sobre la solicitud
    devolver "Contenido";
});
// Cómo se definirán las solicitudes POST
$ router-> post ('/ some / route', function ($ request) {
    // Cómo obtener datos del cuerpo de la solicitud
    $ body = $ request-> getBody ();
});

Ahora que hemos definido cómo se usará nuestro enrutador, vamos a crearlo.

Crea la clase Solicitud.

Primero, defina la interfaz que implementará la clase de solicitud concreta. En IRequest.php define la interfaz IRequest.

getBody () recupera datos del cuerpo de la solicitud. La clase Request debe tener la implementación para este método.

Crea la clase Solicitud.

En el constructor, invoque bootstrapSelf (), un método que establece todas las claves en la matriz global $ _SERVER como propiedades de la clase Request y también asigna sus valores. Este método realiza una llamada al método toCamelCase ().

El método toCamelCase () convierte una cadena de caja de serpiente a caja de camello.

getBody () es una implementación del método definido en la interfaz IRequest.

Crea la clase de enrutador.

En Router.php, agregue el siguiente código para el enrutador.

En el constructor de la clase Router, mantenga una referencia a su dependencia: el objeto Request.

Usemos el método mágico de PHP __call (). Este método se activa al invocar métodos inaccesibles en un contexto de objeto.

Considere el ejemplo de código a continuación.

Estamos intentando invocar el método get () que no está definido en la clase Router, por lo que se activa el método mágico __call (). Recibe dos argumentos. El primer argumento es el nombre del método ("get") y el segundo es una matriz de argumentos que el método get () fue invocado con, por ejemplo, [‘/’, function () {}].

Utilizamos el método mágico __call () para crear dinámicamente una matriz asociativa que asigne rutas a devoluciones de llamada. Creamos uno para cada método de solicitud compatible. Si se llama a un método no válido en el objeto del enrutador, respondemos con un Método 405 no permitido.

El método resolve () selecciona una devolución de llamada que se llama para manejar una solicitud en función del método y la ruta HTTP de la solicitud ('/', '/ foo / bar', etc.).

Ahora que tenemos nuestro enrutador, usémoslo para crear una aplicación.

Crea una aplicación.

En index.php, importe las clases Request y Router que definimos, inicialice un router y defina algunas rutas.

Ejecute y pruebe manualmente la aplicación.

Usemos el servidor de desarrollo de PHP para ejecutar la aplicación en el puerto 8000.

Mientras está en la terminal, cd en la carpeta del proyecto y ejecute el siguiente comando.

$ php -S 127.0.0.1:8000

Abra su navegador web y navegue a http: // localhost: 8000 / y http: // localhost: 8000 / profile para probar las páginas de inicio y de perfil.

Utilice Postman o curl (o cualquier otra herramienta de su elección) para probar la ruta POST a http: // localhost: 8000 / profile.

Aquí hay una captura de pantalla de mi prueba usando cartero.

POST / datos funcionaDELETE / data return 405 Método no permitido

Pensamientos finales.

PHP actualmente tiene poca compatibilidad con los métodos HTTP que permiten enviar datos en el cuerpo de la solicitud, que no sea POST (es decir, PUT, DELETE, PATCH, etc.).

Debe usar php: // input (una secuencia de entrada de solo lectura) para leer datos sin procesar del cuerpo de la solicitud, luego analizar los datos en pares clave-valor.

¿Necesitas contratar a los mejores desarrolladores? Habla con Andela para que te ayude con eso.