Cuando construimos aplicaciones web, uno de los aspectos más cruciales es entender qué solicita el usuario y cómo el sistema debe responder. Aquí desglosamos cómo manejar las solicitudes y qué elementos clave necesitamos configurar para lograr una comunicación fluida entre el cliente y el servidor.
¿Qué es el procesamiento de una petición?
El procesamiento de una petición se refiere a interpretar lo que el usuario solicita a través de una URL. Este proceso implica descomponer la solicitud para identificar la acción que debe tomar el sistema. En términos simples, necesitamos configurar un archivo que sea capaz de leer lo que el usuario quiere (lo que está pidiendo en la URL) y preparar una respuesta adecuada. Aquí nos enfocaremos en entender esa demanda inicial, dejando para una clase posterior cómo se entrega la respuesta.
Para comenzar, trabajaremos con la configuración básica de una clase en PHP que procesará dichas peticiones. Esto se muestra en el siguiente ejemplo de código:
namespaceApp\Http;// Inicializamos las propiedades necesarias para manejar los segmentos de la URLclassRequest{protected$segments=[];protected$controller;protected$method;// Constructor que llena de datos las propiedadespublicfunction__construct(){$this->segments=explode('/',$_SERVER['REQUEST_URI']);$this->setController();$this->setMethod();}protectedfunctionsetController(){$this->controller=empty($this->segments[1])?'home':$this->segments[1];}protectedfunctionsetMethod(){$this->method=empty($this->segments[2])?'index':$this->segments[2];}}
¿Cómo interpretar la URL para definir el controlador y el método?
La URL nos proporciona toda la información necesaria para identificar qué controlador y método debemos utilizar. La estructura típica que manejamos es dominio/controlador/metodo. Aquí hay algunos puntos importantes que cubrir:
Controlador: Es el elemento que determina qué parte de la aplicación gestiona la solicitud. Si no se especifica un controlador en la URL, se asume home como el controlador predeterminado.
Método: Es la acción específica dentro del controlador que se ejecutará. Si no se especifica un método, se usa index por defecto.
Por ejemplo, si la URL que procesamos es platzi.test/servicios, interpretamos que se utilizará ServiciosController con el método index por defecto si no se define uno.
¿Cómo se convierte una URL en un array?
Para procesar correctamente la solicitud, convertimos la URL (un string) en un array para trabajar con cada segmento individualmente. Usamos la función explode() de PHP, que nos permite dividir la cadena de la URL en partes (segmentos).
Aquí está el simple ejemplo del código utilizado para ello:
Este método nos permite acceder fácilmente a diferentes partes de la URL como {$this->segments[1]} para el controlador y {$this->segments[2]} para el método.
Ejercicio práctico
Te invito a realizar este ejercicio por ti mismo. Configura una clase en PHP para manejar las solicitudes como se describe. Luego prueba diferentes URLs en tu sistema local para verificar que los controladores y métodos se identifican correctamente según lo esperado. Esta práctica te ayudará a captar mejor la lógica detrás del procesamiento de solicitudes, una base esencial para trabajar con frameworks como Laravel.
Nos encantaría saber cómo te va, ¡así que no olvides compartir tus avances y preguntar dudas en la sección de comentarios!
Para los qué usan XAMPP y no les sirve la redirección les dice: “¡Objeto no localizado!”, creen un archivo llamado .htaccess en la carpeta public y dentro de él coloquen lo siguiente:
Luego reinicien XAMPP y ya les debería de funcionar.
excelente aporte!, pilas que aplica para quien utilice cualquier solución tipo XAMPP, MAMP, WAMP o semejante
El mejor aporte para los que usamos windows... XD
Una forma rápida para levantar un servidor sin usar apache ni nginx, es usando php
1- Entrar por terminal a la carpeta public/
2- ejecutar php -S localhost:3000
3- Entrar a localhost:3000 en el navegador
Gracias esto no lo sabia.
En este caso, para que las URL dinamicas funcionen correctamente, habra que crear un archivo adicional llamado router.php a la altura de la carpeta que contiene el archivo composer.json (se puede poner en el public pero a mi no me gusta la idea). El archivo debe tener este codigo:
<?phpchdir(__DIR__);$filePath=realpath(ltrim($_SERVER["REQUEST_URI"],'/'));if($filePath&&is_dir($filePath)){// attempt to find an index fileforeach(['index.php','index.html']as$indexFile){if($filePath=realpath($filePath.DIRECTORY_SEPARATOR.$indexFile)){break;}}}if($filePath&&is_file($filePath)){// 1. check that file is not outside of this directory for security// 2. check for circular reference to router.php// 3. don't serve dotfilesif(strpos($filePath,__DIR__.DIRECTORY_SEPARATOR)===0&&$filePath!=__DIR__.DIRECTORY_SEPARATOR.'router.php'&&substr(basename($filePath),0,1)!='.'){if(strtolower(substr($filePath,-4))=='.php'){// php file; serve through interpreterinclude$filePath;}else{// asset file; serve from filesystemreturnfalse;}}else{// disallowed fileheader("HTTP/1.1 404 Not Found");echo"404 Not Found";}}else{// rewrite to our index fileinclude__DIR__.DIRECTORY_SEPARATOR.'public/index.php';}
Luego, desde la consola, nos paramos en la carpet queue contiene el archivo router y ejecutamos:
php -S localhost:3000 -t ./public router.php
Request
Siempre se emplea como namespace el directorio de la clase. No es obligatorio pero es lo más recomendable.
Los namespaces proporcionan una forma de agrupar clases, interfaces, funciones y constantes relacionadas.
Una pregunta, ¿En esta clase tenías configurada algun tipo de redirección? Porque en teoría si entrabas a platzi.test/controller/method PHP debería entenderlo como que quieres entrar a la carpeta controller/method, así que imagino por ahí debería existir algún tipo de redirección mediante htaccess o algo?
Lo mismo me pregunto yo xd :c
buenas noches compañero,
ejecuta
php -S localhost:8080
desde la carpeta public y listo.
El namespace es indispensable para el funcionamiento del autoload es de carácter obligatorio colocarlo, si se nos hace tedioso dar con el namespace correcto hay IDE's como PHPStorm que los colocan por defecto y en VSCODE extensiones que nos lo facilita.
Son necesarios para estructurar nuestro código y evitar conflictos con otras clases/interfaces/traits de librerías que estemos utilizando en nuestro proyecto.
Me ha gustado la forma en que Italo ha llevado este curso.
Creo que no solo el curso, me parece excelente la ruta de aprendizaje, creo que es una de las muy pocas donde cada curso sigue una linea y un proceso
Fatal error: Uncaught Error: Class 'App\Http\Request' not found in C:\xampp\htdocs\frameworks\public\index.php:5 Stack trace: #0 {main} thrown in C:\xampp\htdocs\frameworks\public\index.php on line 5
como puedo solucionar?
Hola. Tuve el mismo problema. Lo que pasó es que no ejecuté el comando "composer dump" que carga los autoloads. Una vez ejecutado el comando quedó resuelto el problema
A mi me pasa el mismo error pero no se me soluciona con ejecutar composer dump desde la terminal
Cómo hace Italo para que su URL empiece con platzi.test?
Hola, Xavier
Aquí tienes un ejemplo con XAMP
Gracias Carlos! :D
El profesor explica muy bien las cosas.
.
Pero en esta clase se omitio aclarar que para el ejercicio se usa un virtual host, que apunta directamente a la carpeta publica.
.
Por otro lado aunque no es de competencia de este curso, haber hablado algo basico sobre el archivo .htaccess.
.
Y lo digo por experiencia con proyectos laravel, wordpress y vanilla PHP, esto hace la diferencia que tu tengas un desarrollo, funciona muy bien localmente y cuando lo pones en un servidor, se rompe porque el router no puede resolver las rutas.
.
Estas configuraciones siempre son un dolor de cabeza !!.
Buenos dias alguien me puede ayudar con este error.
Warning: require(/opt/lampp/htdocs/platzi/vendor/composer/../../app/helpers.php ): Failed to open stream: No existe el archivo o el directorio in /opt/lampp/htdocs/platzi/vendor/composer/autoload_real.php on line 69
Fatal error: Uncaught Error: Failed opening required '/opt/lampp/htdocs/platzi/vendor/composer/../../app/helpers.php ' (include_path='.:/opt/lampp/lib/php') in /opt/lampp/htdocs/platzi/vendor/composer/autoload_real.php:69 Stack trace: #0 /opt/lampp/htdocs/platzi/vendor/composer/autoload_real.php(59): composerRequireb8fe92d3ac917a1fa52b70a8a4100dde('ee3e64abdf9cabd...', '/opt/lampp/htdo...') #1 /opt/lampp/htdocs/platzi/vendor/autoload.php(7): ComposerAutoloaderInitb8fe92d3ac917a1fa52b70a8a4100dde::getLoader() #2 /opt/lampp/htdocs/platzi/public/index.php(3): require('/opt/lampp/htdo...') #3 {main} thrown in /opt/lampp/htdocs/platzi/vendor/composer/autoload_real.php on line 69
El error indica que en el archivo autoload_real.php, no se puede encontrar el archivo helpers.php.
Revisa que en archivo composer.json tengas de esta manera el autoload:
"autoload":{"psr-4":{"App\\":"app/"},//Esta parte es la que te debe estar faltando o tiene algún error:"files":["app/heplers.php"]}
Fatal error: Uncaught Error: Class 'App\Http\Request' not found in C:\xampp\htdocs\frameworks\public\index.php:5 Stack trace: #0 {main} thrown in C:\xampp\htdocs\frameworks\public\index.php on line 5
tengo este error, como puedo solucionar?
Lograste resolver el problema, presento el mismo inconveniente.
Hola Wilson,
Si el error persiste debes tener ojo los archivos Request.php y Response.php, ambos deben estar en la carpeta Http quizás los dejaste dentro de Controllers o en otro lugar por eso no lo encuentra.
El primer elemento de la URL va a ser el controlador, y el segundo representará al método. Esto es por convención standard? o es un ejemplo específico? o es una buena práctica?
este curso me parece genial pero al probar el desarrollo en windows tengo problemas
Hola @claudiomorales 🖐lo que necesitas hacer es lo siguiente:
!Imgur
!Imgur
Ve a la ruta de tu navegador y configúrala apuntando al archivo index.php que se encuentra dentro de app/public/index.php
!Imgur
Da enter y listo podrás visualizar tu proyecto 🤝
!Imgur
Puedes revisar la nota completa en la clase anterior 🔙☺
@javieramayapat cuando hago eso tengo el mismo problema que tu con el vendor/autoload.php
A mi $_SERVER['REQUEST_URI'] me muestra toda la dirección absoluta del archivo, pero puedo usar $_SERVER['QUERY_STRING'].
Una pregunta, no logro hacer que funcionen las llamadas a Request, es como si nunca se estuviera instanciando la clase desde el index.php. Uso un var_dump en el constructor como lo hacen en el video pero no obtengo nada.
Me da este error al correr php -S localhost:8000 en la carpeta public
Hola si pudiste resolver? tengo el mismo problema.
Yo lo resolví con composer dump en el terminal. Fué algo que olvidé.
En mi caso, yo uso laragon para ejecutar php, asi que se me presentó el siguiente problema:
Para solucionarlo cree un documento llamado ".htaccess" en la carpeta public donde se encuentra el index.php, que es un archivo que nos ayuda hacer una configuración al servidor que según tengo entendido, le dice al servidor que active un modulo para poder hacer usar las variables por la URI del navegador.
Funciona a la perfección para quienes estamos usando Laragon, muchas gracias por la ayuda!!
Excelente clase Italo, es increíble he trabajado con CodeIgniter, Laravel pero jamás me había preocupado por ver a profundidad como se realizaba esto, definitivamente esto abre mi mente grandemente...
Reto realizado 🦾
!Imgur
Para los que tienen problemas para redireccionar desde la carpeta raíz a la carpeta public con .htaccess