No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Request: método send

6/14
Recursos

Aportes 25

Preguntas 16

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En resumen, lo que hace la clase Request es obtener de la URL, qué es lo que el usuario quiere visualizar, entonces, de manera dinámica esta clase busca los controladores necesarios para servirle la respuesta al usuario, realmente lo que se hace es concatenar el controlador pasado en la URL con la palabra Controller para crear el nombre del archivo que debemos mandar 😄

Con la función call_user_func() se puede ejecutar un método de una clase, ver el siguiente ejemplo:

<?php

class miclase {
    static function saludar()
    {
        echo "¡Hola!\n";
    }
}

call_user_func(['miclase', 'saludar']);

Si están usando el servidor interno de php, para rutear a /public, usen esta opción

php -S localhost:8000 -t public/

Request: método send


<?php

namespace App\Http;

class Request {
    protected $segments = [];
    protected $controller;
    protected $method;

    public function __construct() {
        $this->segments = explode('/', $_SERVER['REQUEST_URI']);
        
        $this->setController();
        $this->setMethod();
    }

    public function setController() {
        $this->controller = empty($this->segments[1])
            ? 'home'
            : $this->segments[1];
    }

    public function setMethod() {
        $this->method = empty($this->segments[2])
            ? 'index'
            : $this->segments[2];
    }

    public function getController() {
        $controller = ucfirst($this->controller);

        return "App\Http\Controllers\\{$controller}Controller";
    }

    public function getMethod() {
        return $this->method;
    }

    public function send() {
        $controller = $this->getController();
        $method = $this->getMethod();

        $response = call_user_func([
            new $controller,
            $method
        ]);

        $response->send();
    }
}

Para los que trabajan con XAMPP, al momento de pasar los parámetros el servidor lo toma como una dirección ( no como parámetros) y te manda una página 404NotFound.
Para resolverlo:

  1. Crea un archivo .htaccess en la carpeta raíz del projecto (al mismo nivel del composer.json).
    Este es un archivo de texto que configura la forma en que tu servidor web responde a las peticiones de los usuarios.

  2. Escribe en él la siguiente comfiguración:

Options All -Indexes
Options -MultiViews

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ public/index.php [QSA,L]

Lo que hace este archivo es, indexar todos los archivos, acivar la opción de multiviews y configurar algunas cuestiones de redirección.

En estos links puedes ampliar más tu conocimiento al respecto: https://youtu.be/pYDgl1NQZAY

Ahora si te va funcionar el código 😃 espero haberte ahorrado 3 horas de debuggeo intenso y cuestionamiento de elección de carrera ajajajajaja

set         =     Tiene el objetivo de llenar de datos a esas propiedades.
get         =    Obtiene la información configurada.
send      =    Es nuestro método de acción que ejecuta la petición del usuario.

Para poder realizar este ejercicio en una configuración LAMP, usé

array(5) { [0]=> string(0) "" [1]=> string(9) "workspace" [2]=> string(6) "public" [3]=> string(9) "index.php" [4]=> string(9) "contactos" }
Fatal error: Uncaught Error: Class 'App\Http\Controllers\ContactosController' not found in /var/www/apache2/workspace/app/Http/Request.php:41 Stack trace: #0 /var/www/apache2/workspace/public/index.php(11): App\Http\Request->send() #1 {main} thrown in /var/www/apache2/workspace/app/Http/Request.php on line 41

de modo que en el array segments use la pocisión 4 para establecer el controlador y la 5 para establecer el metodo.

No me gustan las clases de este profesor, siento que empieza a explicar el como hacer las cosas pero no especifica ni siquiera que estamos haciendo, o sea ni siquiera nos muestra un vistazo al principio del curso de que es lo que quiere hacer y eso es muy molesto, porque empieza a hacer codigo pero uno ni siquiera saber que es el resultado de lo que programa. es el unico profesor que no explica para que se hacen las cosas sino que de una vez empieza a programar, que estres.

Los que estamos viendo este curso en 2023, tenemos menos problemas, ya que en el curso del profe retax nos enseñaron a configurar los host virtuales y el archivo htaccess:

En la línea 37, para evitar que se rompa por venir el método o controlador en mayúscula (ej. /SERVICIOS/METODO ) es mejor colocar ucfirst(strtolower($this->controller)).

Hay varias Maneras Para llamar a los controladores en php, sin embargo esta me parece Increíble el paso para llamar al controlador y a su metodo, Laravel Usa por defecto los Resource Controllers que se usan para CRUDS y entender como funcionan las peticiones me parece fundamental en dicho framework

resumen patatero, request response, forma parte del estándar http cualquier framework o lenguaje del lado de servidor(python, laravel, go, etc) usa esto y en resumen cosiste en:

request: toda la información enviada desde el cliente , pueden ser json ,formularios, xml , datos en bruto

response: el método por el cual se genera una respuesta para el cliente con la información obtenida y procesada

Request.php

<?php

namespace App\Http;

class Request
{
    protected $segments = [];
    protected $controller;
    protected $method;

    public function __construct()
    {
        //iframeworks.test/
        $this->segments = explode('/',$_SERVER['REQUEST_URI']);

        $this->setController();
        $this->setMethod();
    }

    public function setController()
    {
        $this->controller = empty($this->segments[1])
            ? 'home'
            : $this->segments[1] ;
    }

    public function setMethod()
    {
        $this->method = empty($this->segments[2])
            ? 'index'
            : $this->segments[2] ;
    }

    public function getController() : string
    {
        return 'App\Http\Controllers\\' . ucfirst($this->controller) . 'Controller';
    }

    public function getMethod() : string
    {
        return $this->method;
    }

    public function send()
    {
        $controller = $this->getController();
        $method = $this->getMethod();

        $response = call_user_func([
            new $controller,
            $method
        ]);

        $response->send();
    }
}

Cree el archivo .htaccess y se soluciono el problema de not found pero no veo la ruta home ni contactos si coloco esa url, lo demás si se ve bien, uso xampp, algo debe faltar hacer 😦

A los que por alguna extraña razón les salga un error de que no encuentra la clase Request a la hora de instanciarla. Es muy probable que no hayan configurado correctamente su composer. Lo que tienen que hacer colocarle la configuración correcta en el archivo composer.json y después ejecutar el comando composer dump el cual se encargara de actualizar a la nueva información colocada, de esa forma me pasó, espero les sirva de algo 😃

En algunos lugares he visto que dicen que una clase debe especificarse en una cosa en este caso nuestra clase realiza muchas cosas pero siempre enfocada al URI_PATH, es normal que sea asi o es mala practica que la clase contenga tantos metodos ?
Si estan utilizando el servidor xamp para sus testeos les recomiendo configurar el httpd.conf y elijan una carpeta por default para cada vez que inicien su servidor apache no tengan qie ajustar entre rutas. Solo es una facilidad que recomiendo Otra cosa ed crear una carpeta donde esten todas sus otras carpetas de proyectos con php y refernciar su httpd.conf hacia alli y asi el apache automaticamente los emviara alli cuando se inicie

Que entretenido: “Fíjate” es la palabra que el profe usa como atajo para decir: “Hagamos un repaso del flujo en el código, recientemente explicado, antes de continuar con la explicación” XD

Excelente clase, ya que estoy usando xampp tuve que configurar apache con los archivos .htaccess dentro de la carpeta raiz y la carpeta public. Tambien tuve que modificar el archivo httpd.conf para configurar el documento raiz & directorio.

me aparecía así, la cosa es que mi url no esta como del profe asi que lo solucione poniendo en el array correspondiente.

  public function setController()
  {
    $this->controller = empty($this->segments[5])
      ? 'home'
      : $this->segments[5];
  }

  public function setMethod()
  {
    $this->method = empty($this->segments[6])
      ? 'index'
      : $this->segments[6];
  }

No seria mejor aplicar un patrón “Factory” para obtener los controladores?

Excelente

mi código que vimos en la clase:

index.php

<?php

require __DIR__ . '/../vendor/autoload.php';

$request = new App\Http\Request;
 $request->send();

Request.php

<?php

namespace App\Http;

class Request 
{
    protected $segments = [];
    protected $controller;
    protected $method;

    public function __contruct()
    {
        //platzi.test/servicios/index
        $this->segments = explode('/', $_SERVER['REQUEST_URI']);

        //var_dump($_SERVER['REQUEST_URI']);
        $this->setController(); //le estamos diciendo que llene al controlador.
        $this->setMethod();
    }


    public function setController()
    {
        $this->conroller = empty($this->segments[1])
            ? 'home'
            : $this->segments[1];
    }


    public function setMethod()
    {
        $this->method = empty($this->segments[2])
            ? 'index'
            : $this->segments[2];
    }

    public function getController()
    {
        //le decimos obten lo que esta en el controlador pero con esta configuración.
        $controller = ucfirst($this->controller);
        //Home HomeController
        return "App\Http\Controllers\\{$controller}Controller";
    }

    //ahora obtenemos al método.

    public function getMethod()
    {
        return $this->method;
    }

    public function send()
    {

        $controller = $this->getController();
        $method = $this->getMethod();
        //Quiero que se ejecute el controlador.
        //call_user_func = esta funcion me ayuda a permitir ejecutar archivos y métodos.
        $response = call_user_func([
            new $controller,
            $method
        ]); 

        $response->send();
    }

}

Warning: require(C:\xampp\htdocs\ProyectoFramework\public…/vendor/autoload.php): failed to open stream: No such file or directory in C:\xampp\htdocs\ProyectoFramework\public\index.php on line 2

Fatal error: require(): Failed opening required ‘C:\xampp\htdocs\ProyectoFramework\public…/vendor/autoload.php’ (include_path=‘C:\xampp\php\PEAR’) in C:\xampp\htdocs\ProyectoFramework\public\index.php on line 2


Al ejecutar me salen los siguientes mensajes.
¿Alguien me puede ayudar a solucionar estos errores?