Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Não estou conseguindo acessar a página através do front-crontroller

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;
    }
}
1 resposta
solução!

Resolvi lendo problemas parecidos em outros cursos aqui da Alura e no stackoverflow. Rodei de novo o comando composer install, daí recebi: Uncaught RuntimeException: Setup tool cannot configure caches without doctrine/cache 1.11 or symfony/cache Depois rodei composer require symfony/cache e deu certo. A página está abrindo normalmente através do front-controller.