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

Publicação do MVC num servidor

Boa noite, pessoal.

Fiz o curso MVC PHP e gostei bastante. Obrigado, Vinicius.

Desenvolvi o meu próprio projeto, tudo funcionou na minha máquina. A dor de cabeça começou quando descobri que a minha hospedagem não permitia o uso do composer. Como não usei bibliotecas(dependências) pois o interesse no composer era apenas o PSR-4, decidi fazer o autoload manual.

Aparentemente tudo estava ok, o sistema carrega o index.php... Outro obstáculo foi o problema do $_SERVER['PATH_INFO'] que tratei da seguinte, escrevi como orientado noutra tread do forum $_SERVER['PATH_INFO'] ?? "/login".

O que aconteceu foi o seguinte, mesmo com as rotas e arquivos nas pastas corretas, não há o carregamento do arquivo que faz a autenticação, /act-autenticar-usuario, o resultado do submit sempre é um erro 404 e nada é lido.

O curioso é que quando adiciono o index.php na url, por exemplo, http://projeto/index.php/act-autenticar-usuario, há uma resposta, o sistema lê a url e executa a autenticação. Não sei o que está havendo, alguém pode me ajudar?

Muito grato, Luiz.

Abaixo postei o autoload e index.

  1. autoload completo
    spl_autoload_register(function (string $nomeCompletoDaClasse)
    {
     $caminhoArquivo = str_replace('Projeto\\', '..\\core/', $nomeCompletoDaClasse);
     $caminhoArquivo = str_replace('\\', DIRECTORY_SEPARATOR, $caminhoArquivo);
     $caminhoArquivo .= '.php';
     if(file_exists($caminhoArquivo)) 
     {
         require_once $caminhoArquivo;
     }
    });
  2. index
    <?php
    // carrega o autoload - manual
    require __DIR__ . '/../autoload/autoload.php';
    // obtem a url
    $caminho = $_SERVER['PATH_INFO'] ?? "/login";
    // obtem as rotas
    $rotas = require __DIR__ . '/../config/routes.php';
    // checa se uma rota valida foi pro http
    if(!array_key_exists($caminho,$rotas))
    {
     // devolve 404 e sai
     http_response_code(404);
     exit();
    }
    // inicia a secao
    session_start();
    // checa se ha um login
    if(!isset($_SESSION['logado']) && $caminho !== '/login' && $caminho !== '/act-autenticar-usuario')
    {
     header('Location: /login');
     exit();
    }
    // monta a requisicao
    $classeControladora = $rotas[$caminho];
    $controlador = new $classeControladora();
    $controlador -> ProcessarRequisicao();
1 resposta
solução!

Boa noite, felizmente resolvi o problema.

Além do autoload manual,

spl_autoload_register(function (string $nomeCompletoDaClasse)
{
 $caminhoArquivo = str_replace('Projeto\\', '..\\core/', $nomeCompletoDaClasse);
 $caminhoArquivo = str_replace('\\', DIRECTORY_SEPARATOR, $caminhoArquivo);
 $caminhoArquivo .= '.php';
 if(file_exists($caminhoArquivo)) 
 {
     require_once $caminhoArquivo;
 }
}); 

Fiz o seguinte no index,

// carrega o autoload - manual
require '../autoload/autoload.php';
// obtem o caminho para a rota
$caminho = $_SERVER['REQUEST_URI'];
// na raiz ajusta a rota para o login
if($caminho == "/")
{
    $caminho = "/login";
}
// obtem as rotas
$rotas = require '../config/routes.php';
// checa se uma rota valida foi pro http
if(!array_key_exists($caminho,$rotas))
{
    // devolve 404 e sai
    http_response_code(404);
    exit();
}
// inicia a secao
session_start();
// checa se ha um login
if(!isset($_SESSION['logado']) && $caminho !== '/login' && $caminho !== '/act-autenticar-usuario')
{
    // die ("aqui");
    header('Location: /login');
    exit();
}
// monta a requisicao
$classeControladora = $rotas[$caminho];
$controlador = new $classeControladora();
$controlador -> ProcessarRequisicao();

Sei que o $_SERVER['REQUEST_URI'], precisa do parse_url(), por conta de segurança e para remover da URI apenas o necessário, a "\pagina", eu creio. De qualquer forma, deve funcionar com ambos.

Por fim, criei um arquivo .httaccess com o seguinte dentro:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Bom, foi isso que fiz. Espero estar ajudando, grande abraço. Luiz.