Шаблон проектирования Контроллер страниц — это распространенный архитектурный подход, используемый в веб-системах. Он организует поток управления, выделяя определенный контроллер для обработки логики отдельной страницы или запроса. Такой подход помогает изолировать обязанности, упрощая поддержку и развитие кодовой базы.
В шаблоне Контроллер страниц каждая страница (или группа страниц со схожим поведением) имеет свой собственный контроллер, отвечающий за:
Типичная реализация включает в себя следующие компоненты:
Поток
Структура файла
/htdocs /src /Controllers HomeController.php AboutController.php /Services ViewRenderer.php /Views home.html.php about.html.php /public index.php /routes.php composer.json
Автозагрузчик
{ "autoload": { "psr-4": { "App\\": "htdocs/" } } }
composer dump-autoload
Шаблон
Шаблон для главной страницы и 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
Обрабатывает логику домашней страницы.
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); } }
О контроллере
Обрабатывает логику страницы «О нас».
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
Определяет сопоставление маршрутов с контроллерами.
use App\Controllers\HomeController; use App\Controllers\AboutController; // Define the routes in an associative array return [ '/' => HomeController::class, '/about' => AboutController::class, ];
index.php
Точка входа приложения.
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."; }
Преимущества
Недостатки
Для более сложных проектов, где существует значительное повторное использование логики или несколько точек входа, более подходящими могут быть такие шаблоны, как Front Controller или полная архитектура MVC.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3