O padrão de design Page Controller é uma abordagem de arquitetura comum usada em sistemas baseados na web. Ele organiza o fluxo de controle dedicando um controlador específico para lidar com a lógica de uma página ou solicitação individual. Essa abordagem ajuda a isolar responsabilidades, tornando a base de código mais fácil de manter e evoluir.
No padrão Page Controller, cada página (ou grupo de páginas com comportamento semelhante) possui seu próprio controlador, responsável por:
Uma implementação típica envolve os seguintes componentes:
Fluxo
Estrutura do arquivo
/htdocs /src /Controllers HomeController.php AboutController.php /Services ViewRenderer.php /Views home.html.php about.html.php /public index.php /routes.php composer.json
Autocarregador
{ "autoload": { "psr-4": { "App\\": "htdocs/" } } }
composer dump-autoload
Modelo
Modelo para a página inicial e about.html.php.
= htmlspecialchars($title) ?> = htmlspecialchars($title) ?>
= htmlspecialchars($content) ?>
ViewRenderer
namespace App\Services; class ViewRenderer { public function render(string $view, array $data = []): void { extract($data); // Turns array keys into variables include __DIR__ . "/../../Views/{$view}.html.php"; } }
HomeController
Lida com a lógica da página inicial.
namespace App\Controllers; use App\Services\ViewRenderer; class HomeController { public function __construct(private ViewRenderer $viewRenderer) { } public function handleRequest(): void { $data = [ 'title' => 'Welcome to the Site', 'content' => 'Homepage content.', ]; $this->viewRenderer->render('home', $data); } }
SobreControlador
Lida com a lógica da página "Sobre nós".
namespace App\Controllers; use App\Services\ViewRenderer; class AboutController { public function __construct(private ViewRenderer $viewRenderer) { } public function handleRequest(): void { $data = [ 'title' => 'About Us', 'content' => 'Information about the company.', ]; $this->viewRenderer->render('about', $data); } }
routes.php
Define mapeamentos de rotas para controladores.
use App\Controllers\HomeController; use App\Controllers\AboutController; // Define the routes in an associative array return [ '/' => HomeController::class, '/about' => AboutController::class, ];
index.php
O ponto de entrada do aplicativo.
require_once __DIR__ . '/../vendor/autoload.php'; use App\Services\ViewRenderer; // Include the routes $routes = require_once __DIR__ . '/../routes.php'; // Instantiate the view rendering service $viewRenderer = new ViewRenderer(); // Get the current route from the request URI $requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // Check if the route exists and resolve the controller if (isset($routes[$requestUri])) { $controllerClass = $routes[$requestUri]; $controller = new $controllerClass($viewRenderer); $controller->handleRequest(); } else { http_response_code(404); echo "Page not found."; }
Vantagens
Desvantagens
Para projetos mais complexos, onde há reutilização lógica significativa ou múltiplos pontos de entrada, padrões como Front Controller ou arquitetura MVC completa podem ser mais adequados.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3