Consegui usar rotas seguindo o mesmo modelo criado pelo professor no curso. Na aula o professor ensinou que "se temos uma string (um texto) que seja o nome de uma classe em uma variável, podemos instanciá-la com o new." Daí segui os mesmos passos na criação de um projeto pessoal, mas estou recebendo o seguinte erro justamente na linha que instancio a classe através da string:
Fatal error: Uncaught Error: Class 'Lucas\Procedo\Controller\FormularioAdicionarCliente' not found in C:\Users\Tonantins\Documents\curso-php\mvc-procedo\public\index.php:24 Stack trace: #0 {main} thrown in C:\Users\Tonantins\Documents\curso-php\mvc-procedo\public\index.php on line 24
Vou deixar abaixo o código de:
- index.php
- routes.php
- FormularioAdicionarCliente.php
- InterfaceControladorRequisicao
- ControllerComHtml.php
Código de index.php
<?php
use Lucas\Procedo\Controller\FormularioAdicionarCliente;
use Lucas\Procedo\Controller\InterfaceControladorRequisicao;
require __DIR__ . '/../vendor/autoload.php';
$caminho = $_SERVER["PATH_INFO"];
$rotas = require __DIR__ . '/../config/routes.php';
if(!array_key_exists($caminho, $rotas)){
http_response_code(404);
exit();
}
//se o caminnho existir ele vai pegar o valor desse caminho no array rotas
//esses valores são as classes informadas no arquivo config/routes.php
$classeControladora = $rotas[$caminho];
/**
* @var InterfaceControladorRequisicao $controlador
*/
$controlador = new $classeControladora();
$controlador->processaRequisicao();
Usando o var_dump
na variável $classeControladora
consigo ver que o arquivo routes.php está devolvendo o namespace da classe a ser instanciada. Agradeço quem puder lançar luz na situação.
Código de routes.php
<?php
use Lucas\Procedo\Controller\FormularioAdicionarCliente;
$rotas = [
'/adicionar-cliente' => FormularioAdicionarCliente::class,
];
return $rotas;
Código de FormularioAdicionarCliente.php
<?php
namespace Lucas\Procedo\Controller;
class FormularioAdicionarCliente extends ControllerComHtml implements InterfaceControladorRequisicao
{
public function processaRequisicao(): void
{
echo $this->renderizaHtml(
'clientes/formulario.php', [
'tituloDaPagina' => "Novo cliente",
'titulo' => "Adicionar cliente",
]
);
}
}
Código de InterfaceControladorRequisicao.php
<?php
namespace Lucas\Procedo\Controller;
interface InterfaceControladorRequisicao
{
public function processaRequisicao(): void;
}
Código de ControllerComHtml.php
<?php
namespace Lucas\Procedo\Controller;
abstract class ControllerComHtml
{
public function renderizaHtml(string $caminhoDoTemplate, array $dados): string
{
extract($dados);
ob_start();
require __DIR__ . '/../../views/' . $caminhoDoTemplate;
$html = ob_get_clean();
return $html;
}
}