No tienes acceso a esta clase

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

Request: método send

6/14
Recursos

Aportes 22

Preguntas 14

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

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();
    }
}
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 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

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

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.

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();
    }
}

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

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

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)).

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?