Download the PHP package chrispo/routex-php without Composer
On this page you can find all versions of the php package chrispo/routex-php. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Informations about the package routex-php
routex-php
Un enrutador HTTP ligero para PHP 8.3+ con una API inspirada en Express.js.
Ejemplos
Características
- API estilo Express.js —
get(),post(),put(),patch(),delete(),options() - Rutas dinámicas — parámetros
:id,:slug, múltiples params por ruta - Grupos de rutas — prefijos compartidos con
group() - Middleware — pipeline Chain of Responsibility con
use()(global) y->middleware()(por ruta) - Respuestas fluent —
status(),json(),send(),html(),redirect(),header() - Manejo de errores — handlers personalizados para 404, 405 y excepciones globales
- Sin dependencias — solo PHP puro, sin frameworks externos
Instalación
Requisitos: PHP 8.3+
Inicio rápido
Levantar el servidor:
Estructura de carpetas recomendada
public/index.php queda limpio:
src/routes.php concentra todas las rutas:
Rutas
Métodos HTTP
Parámetros dinámicos
Usa :nombre para capturar segmentos de la URL:
Query string
Grupos de rutas
Agrupa rutas bajo un prefijo común. Todos los sub-handlers heredan el prefijo:
Middleware
El middleware sigue el patrón Chain of Responsibility: cada pieza puede modificar la petición/respuesta, llamar a $next para continuar la cadena, o cortarla devolviendo una respuesta directa.
Crear un middleware
Implementa MiddlewareInterface:
Middleware global
Se aplica a todas las rutas del router:
Middleware por ruta
Solo se aplica a la ruta específica. Se encadena con ->middleware():
Middleware de grupo
Dentro de group(), use() aplica solo a las rutas del grupo:
Orden de ejecución
El pipeline respeta el orden de registro: el primer middleware registrado es el primero en ejecutarse y el último en terminar (outer → inner):
Request & Response
Request — métodos disponibles
| Método | Descripción | Ejemplo |
|---|---|---|
param('key') |
Parámetro dinámico de ruta | $req->param('id') → '42' |
query('key', $default) |
Valor de query string | $req->query('page', '1') |
body('key', $default) |
Campo del body JSON o POST | $req->body('email') |
body() |
Todo el body como array | $req->body() |
header('Name') |
Cabecera HTTP | $req->header('Authorization') |
all() |
Body + query + params fusionados | $req->all() |
rawBody() |
Body sin parsear (webhooks) | $req->rawBody() |
ip() |
IP del cliente | $req->ip() |
isJson() |
Content-Type es application/json | $req->isJson() |
isXhr() |
Petición AJAX | $req->isXhr() |
getMethod() |
Método HTTP | $req->getMethod() → 'GET' |
getPath() |
Path sin query string | $req->getPath() → '/users/42' |
Response — métodos disponibles
| Método | Descripción | Ejemplo |
|---|---|---|
json($data) |
Serializa a JSON y envía | $res->json(['id' => 1]) |
send($body) |
Envía texto plano | $res->send('pong') |
html($content) |
Envía HTML | $res->html('<h1>Hello</h1>') |
redirect($url, $code) |
Redirige (302 por defecto) | $res->redirect('/login') |
status($code) |
Establece el código HTTP | $res->status(201)->json(...) |
header($name, $value) |
Añade cabecera HTTP | $res->header('X-Token', 'abc') |
withHeaders($array) |
Añade múltiples cabeceras | $res->withHeaders([...]) |
Los métodos status() y header() son fluent (retornan $this) y pueden encadenarse:
Manejo de errores
404 — ruta no encontrada
405 — método no permitido
La excepción incluye los métodos permitidos para esa ruta:
Errores globales
Captura cualquier excepción no controlada lanzada dentro de un handler:
Ejemplos completos
El archivo index.php en la raíz del repositorio contiene ejemplos listos para ejecutar de todo lo anterior:
| Sección | Qué demuestra |
|---|---|
GET / |
Respuesta JSON básica |
GET /ping |
Healthcheck con texto plano |
GET /users |
Lista con paginación via query string |
POST /users |
Creación con validación de body JSON |
GET /users/:id |
Parámetro dinámico |
PUT /users/:id |
Reemplazar recurso |
PATCH /users/:id |
Actualización parcial |
DELETE /users/:id |
Eliminar recurso (204 sin body) |
GET /api/v1/products |
Grupo con prefijo /api/v1 |
GET /posts/:year/:month/:slug |
Tres parámetros en una sola ruta |
GET /admin/dashboard |
Grupo protegido con AuthMiddleware |
GET /reports |
Middleware por ruta individual |
GET /go |
Redirección 301 |
| Custom 404 / 405 / error | Handlers personalizados de error |
Para ejecutarlo:
Tests
El proyecto incluye 91 tests con Pest:
Benchmarks
Mediciones de rendimiento con PHPBench:
Resultados de referencia (PHP 8.5, sin opcache):
| Benchmark | Tiempo | Descripción |
|---|---|---|
| Ruta estática | ~2 µs | Caso base |
| Ruta dinámica | ~2.5 µs | +25% por regex |
| 50 rutas registradas | ~17 µs | O(n) lineal |
| Con 3 middlewares | ~3 µs | +45% overhead pipeline |
| Sin middlewares | ~2 µs | Baseline |
| Ruta no encontrada | ~1.5 µs | Loop + excepción |