Ir para conteúdo
Fórum Script Brasil
  • 0

MVC O roteador e o autoload de William Duarte


Frank K Hosaka

Pergunta

O código a seguir é de alto nível, eu jamais seria capaz de escrevê-lo.

O código original do roteador do William pressupõe que o desenvolvedor vai usar a chave 'rota' para redirecionar o comando para outro canto do código. No HTML, seria mais ou menos assim <form action="?rota=ControleLogin.menu"> ou <a href="?rota=ControleLogin.menu">. Eu alterei para não usar nenhuma chave.

Arquivo Index.php
<?php
ini_set('display_errors', 1);
require __DIR__ . '/Modelos/Config.php';
$rota='ControleLogin_login';
if($_GET)
{
    $rota=isset($_GET) ? key($_GET) : $rota;
}
$segmentos=explode('_',$rota);
$nomeControle=$segmentos[0] ?? 'ControleLogin';
$metodo=$segmentos[1] ?? 'login';
$parametro=$segmentos[2] ?? null;
$controle=new $nomeControle();
$controle->$metodo($parametro);

arquivo Modelos / Config.php
<?php
date_default_timezone_set('America/Sao_Paulo');

$baseDir = $_SERVER['SERVER_NAME'] === 'astudy.net' ? 
    $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/POO/';

define('PROJETO', $baseDir);
define('CONTROLES', PROJETO.'/Controles/');
define('MODELOS', PROJETO.'/Modelos/');
define('VISOES', PROJETO.'/Visoes/');
define('HOST', 'localhost');
define('DBNAME', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Diario' : 'diario');
define('USER', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Root' : 'root');
define('PASSWORD', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? '12345678' : '');

spl_autoload_register(function ($classe) 
{
    $diretorios = ['Controles', 'Modelos', 'Visoes'];
    foreach ($diretorios as $diretorio) 
    {
        $arquivo = PROJETO . DIRECTORY_SEPARATOR . $diretorio . DIRECTORY_SEPARATOR . $classe . '.php';
        if (file_exists($arquivo)) 
        {
            require_once $arquivo;
            return;
        }
    }
    throw new Exception("Erro ao carregar a classe '{$classe}'. Arquivo não encontrado.");
});

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 1

Embora seu esforço seja notável, há espaço para aprimoramento. Uma questão fundamental que ainda não compreendi é essa insistência em soluções provisórias e improvisadas. Importante frisar que o mundo não estará sempre pronto para oferecer auxílio; é imprescindível dedicar-se aos estudos para, de fato, compreender a essência da programação em um nível avançado.

Tomemos como exemplo um código de alta qualidade. Sem um entendimento claro dos seus objetivos, torna-se desafiador alcançar a excelência. Sua situação me lembra alguém que conheço. Você menciona a necessidade de uma curva de aprendizado para fazer as coisas funcionarem, entretanto, parece resistir à ideia de que este processo exige adaptação e evolução pessoal. Não percebe que a rigidez em sua maneira de pensar mais atrapalha do que ajuda.

Para progredir em programação ou em qualquer campo técnico é crucial estar aberto a aprender e adaptar-se. A compreensão profunda e o domínio vêm com a prática contínua e a disposição para explorar novas abordagens, descartando métodos que, embora familiares, são ineficazes. A excelência em programação é um percurso contínuo de aprendizado, adaptação e refinamento.

Se você deseja compreender verdadeiramente o que é o padrão MVC (Model-View-Controller), é essencial que se esforce para entender a seguinte estrutura básica padrão de diretórios:

/projeto
|-- /public
|   |-- index.php
|-- /app
|   |-- /controllers
|   |   |-- Controller.php
|   |   |-- MeuController.php
|   |-- /models
|   |-- /views
|       |-- minhaAction.php
|-- /router
|   |-- Router.php
|   |-- web.php
|-- .htaccess


Nessa estrutura:

- /public: Diretório público que contém o arquivo index.php, ponto de entrada da aplicação.
- /app: Diretório principal que contém os subdiretórios para controllers, models e views.
  - /controllers: Contém os arquivos controladores, como Controller.php e MeuController.php, que gerenciam a lógica de como os dados são processados e respondidos.
  - /models: Mantém os arquivos que representam a lógica de negócios e a interação com o banco de dados.
  - /views: Diretório para os arquivos que compõem a interface visual, como minhaAction.php, que é responsável por exibir os dados ao usuário.
- /router: Contém o Router.php, que direciona as requisições para os controladores apropriados, e o web.php, que define as rotas da aplicação.
- .htaccess: Arquivo de configuração usado, principalmente em servidores Apache, para reescrever URLs, redirecionando todas as requisições para o index.php no diretório público, sem expor a estrutura interna do projeto.
 

Entender cada componente e sua função dentro do padrão MVC é crucial para o desenvolvimento eficiente e organizado de aplicações web.

Arquivos e Conteúdo:

/public/index.php
 

<?php

require_once __DIR__ . '/../router/Router.php';
$router = new Router();

require_once __DIR__ . '/../router/web.php';

$router->dispatch();


/app/controllers/Controller.php

<?php

class Controller {
    protected function view($viewName, $data = []) {
        extract($data);
        require __DIR__ . '/../views/' . $viewName . '.php';
    }
}



/app/controllers/MeuController.php

<?php

class MeuController extends Controller {
    public function minhaAction($param = null) {
        $this->view('minhaAction', ['mensagem' => 'Você está na minhaAction de MeuController', 'param' => $param]);
    }
}


/app/views/minhaAction.php

<!DOCTYPE html>
<html>
<head>
    <title>Minha Action</title>
</head>
<body>
    <h1><?= htmlspecialchars($mensagem, ENT_QUOTES, 'UTF-8') ?></h1>
    <?php if ($param): ?>
        <p>Parâmetro: <?= htmlspecialchars($param, ENT_QUOTES, 'UTF-8') ?></p>
    <?php endif; ?>
</body>
</html>

 

/router/Router.php

<?php

class Router {
    private $routes = [];

    public function add($route, $controllerAction) {
        $this->routes[$route] = $controllerAction;
    }

    public function dispatch() {
        $uri = trim($_SERVER['REQUEST_URI'], '/');
        $uriSegments = explode('/', $uri);

        $route = $uriSegments[0];
        $param = $uriSegments[1] ?? null;

        if (array_key_exists($route, $this->routes)) {
            [$controllerName, $actionName] = explode('@', $this->routes[$route]);

            require_once __DIR__ . '/../app/controllers/' . $controllerName . '.php';

            $controller = new $controllerName();
            if (method_exists($controller, $actionName)) {
                call_user_func([$controller, $actionName], $param);
            } else {
                echo "Action not found in controller.";
            }
        } else {
            echo "No route defined for this URI.";
        }
    }
}

/router/web.php Arquivo para definição de rotas.

<?php

$router->add('minha-action', 'MeuController@minhaAction');


.htaccess: Configuração do Apache para redirecionar todas as solicitações para index.php.

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


Esses arquivos e a estrutura de diretórios devem compor uma aplicação PHP simplificada seguindo o padrão MVC, com rotas definidas em um arquivo separado e a capacidade de estender um controller base para compartilhar funcionalidades comuns.

Não adianta eu gastar meu tempo explicando conceitos e técnicas, se cada vez que você volta a este fórum, ignora tudo o que foi dito e persiste em aplicar seus antigos códigos de maneira errônea. Você nem sequer consegue identificar o paradigma que está usando, o que é básico. Simplesmente jogar funções dentro de classes sem entender o propósito é inútil e demonstra uma falta grave de compreensão.

A programação é um campo técnico que exige mais do que apenas ouvir ou ler sobre novos conceitos; você precisa internalizá-los e aplicá-los de forma eficaz. Ignorar deliberadamente as boas práticas globais e as metodologias reconhecidas, optando por soluções ultrapassadas ou gambiarras, é sabotar sua carreira e a qualidade de seu trabalho.

É imprescindível que você mude sua atitude e adote um compromisso genuíno com o aprendizado contínuo. Atualize suas habilidades e seu código. Abandone as velhas práticas ineficazes, dedique-se a estudar seriamente e aplique o que aprendeu. A indústria da programação não tem espaço para teimosia ou acomodação. Se você quer ser respeitado como programador, precisa evoluir constantemente.

Na próxima vez que postar neste fórum, mostre que você está tentando progredir. Faça perguntas que demonstrem seu interesse em aprender e melhorar. Evite a todo custo a Programação Orientada a Gambiarras (POG). Aspire a ser alguém que busca respostas certas e se esforça para realmente compreender e aplicar as melhores práticas de programação. Só assim você crescerá na sua carreira e ganhará o respeito dos seus pares.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...