В настоящем руководстве мы не будем реализовывать MVC (Модель-Представление-Контроллер). Вообще-то, MVC правильно реализовать на PHP невозможно, по крайней мере, так, как это было изначально задумано. Если нужны подробности, почитайте «Руководство для начинающих по MVC» и последующие посты.
Так что забудьте о MVC и вместо этого озаботьтесь разделением ответственностей.
Нам понадобится описательное имя для классов, обрабатывающих запросы. Здесь я буду называть их контроллеры, потому что они знакомы людям, имеющим опыт работы с фреймворками. Вы также можете называть их Обработчиками (Handlers).
Создайте новую папку внутри папки src/ с именем Controllers. В эту папку мы поместим все наши классы контроллеров. Создайте в ней файл Homepage.php.
<?php declare(strict_types = 1); namespace Example\Controllers; class Homepage { public function show() { echo 'Hello World'; } }
Автозагрузчик будет работать только в том случае, если пространство имен класса соответствует пути к файлу, а имя файла соответствует имени класса. Вначале я определил Example как корневое пространство имен приложения, ведущее в папку src/. Теперь давайте изменим роут hello world, чтобы он вместо замыкания вызывал наш новоиспеченный метод класса контроллера. Измените свой Routes.php так:
return [ ['GET', '/', ['Example\Controllers\Homepage', 'show']], ];
Вместо просто вызываемого объекта вы теперь передаете массив. Первое значение — это имя класса с полным пространством имен, второе — имя метода, который вы хотите вызвать. Чтобы все заработало, придется провести небольшой рефакторинг секции маршрутизации в Bootstrap.php:
case \FastRoute\Dispatcher::FOUND: $className = $routeInfo[1][0]; $method = $routeInfo[1][1]; $vars = $routeInfo[2]; $class = new $className; $class->$method($vars); break;
Таким образом, вместо простого вызова метода вы теперь создаете экземпляр объекта, а затем вызываете его метод.
Теперь, если вы посетите http://localhost:8000/, все должно работать. Если нет, возвращайтесь и отлаживайте. И, конечно же, не забудьте зафиксировать изменения.