Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Routes e Controller

Opa, será que alguém poderia me ajudar, eu queria entender melhor essa parte de routes e controller, não entendi muito bem como o PHP armazena isso e como é que passa ele pelo index

<?php

declare(strict_types=1);

return [
    'GET|/' => \Alura\Mvc\Controller\VideoListController::class,
    'GET|/novo-video' => \Alura\Mvc\Controller\VideoFormController::class,
    'POST|/novo-video' => \Alura\Mvc\Controller\NewVideoController::class,
    'GET|/editar-video' => \Alura\Mvc\Controller\VideoFormController::class,
    'POST|/editar-video' => \Alura\Mvc\Controller\EditVideoController::class,
    'GET|/remover-video' => \Alura\Mvc\Controller\DeleteVideoController::class,
    'GET|/login' => \Alura\Mvc\Controller\LoginFormController::class,
];
2 respostas
solução!

Oii, Guilherme.

Não entendi muito bem como o PHP armazena isso

Você tem um arquivo routes.php que o objetivo dele é retornar um array associativo, você pode pensar como um "mapa" que indica qual controller será responsável por cada requisição que chegar do cliente. Por exemplo: Se o usuário quiser acessar a página "/novo-video", você definiu que o VideoFormController será o responsável por lidar com essa requisição.

Como é que passa essas informações pelo index?

No arquivo index.php usamos o require_once para incluir o código da routes.php em uma variável $routes. Dessa forma:

$routes = require_once __DIR__ . '/../config/routes.php';

A partir disso precisamos capturar o que o usuário digitou na URL do navegador, e se ele não digitar nada podemos definir "/". Isso é feito por meio de:

$routes = require_once __DIR__ . '/../config/routes.php';
$pathInfo = $_SERVER['PATH_INFO'] ?? '/';

Em seguida, precisamos capturar qual o método HTTP foi usado para obter essa requisição, foi POST? GET? Podemos resolver com o código abaixo:

$routes = require_once __DIR__ . '/../config/routes.php';
$pathInfo = $_SERVER['PATH_INFO'] ?? '/';
$httpMethod = $_SERVER['REQUEST_METHOD'];

Perfeito, com esses dados em mãos eu posso fazer uma busca pelo que o usuário está buscando no nosso "mapa". Para isso eu preciso juntar as informações de: o recurso que o usuário está querendo: $pathInfo = $_SERVER['PATH_INFO'] ?? '/'; e o método http usado: $httpMethod = $_SERVER['REQUEST_METHOD'];. Dessa forma, podemos realizar a busca e teremos:

$routes = require_once __DIR__ . '/../config/routes.php';

$pathInfo = $_SERVER['PATH_INFO'] ?? '/';
$httpMethod = $_SERVER['REQUEST_METHOD'];

$key = "$httpMethod|$pathInfo";
if (array_key_exists($key, $routes)) {
    $controllerClass = $routes["$httpMethod|$pathInfo"];

    $controller = new $controllerClass($videoRepository);
} else {
    $controller = new Error404Controller();
}

Veja que foi usado a função array_key_exists para verificar a $key dentro do nosso dicionário: $routes, para retornar o controller responsável pela requisição.

Espero ter ajudado e bons estudos :)

Obrigado Vinicius sua explicação me ajudou a entender melhor, notei que tbm havia me esquecido que o $_SERVER busca diversas infos e por isso ali puxava o caminho e o metodo, muito obrigado por mais uma ajuda ^^