Пошаговое руководство по созданию простого блога на PHP с применением MVC паттерна

Сначала определи структуру. Разбей проект на три части: данные (модели), представление (шаблоны) и управление (контроллеры). Папки должны быть названы понятно: Models, Views, Controllers. Такой подход упростит поддержку и масштабирование.

Далее настрой маршрутизацию. Один входной файл, например index.php, должен обрабатывать все запросы и направлять их в нужный контроллер. Используй htaccess для переадресации, чтобы избавиться от лишних параметров в URL.

Модели работают напрямую с базой. Лучше использовать PDO с подготовленными запросами. Это безопаснее и универсальнее. Храни настройки подключения отдельно, не в каждом файле – создай отдельный конфиг и подключай его через require_once.

Минимум сторонних зависимостей – максимум контроля. Такой подход поможет лучше понять, как всё работает внутри, и избежать лишней магии. Всё просто, если чётко разделить роли между файлами.

Настройка структуры проекта и организация директорий для MVC-архитектуры

Сразу выноси ядро логики из корневой папки – создай каталог app/. Внутри него размести три ключевые директории: Controllers/, Models/ и Views/. Так код не будет перемешан, и каждый компонент будет на своём месте.

Папки и их назначение

Controllers/ – сюда идут все классы, обрабатывающие запросы. Названия файлов должны совпадать с именами классов и заканчиваться на Controller, например: PostController.php.

Models/ – здесь размещаются классы, взаимодействующие с базой данных. Удобно, если каждый файл соответствует одной таблице, например: Post.php.

Views/ – шаблоны отображения. Раздели по контроллерам: views/post/index.php, views/post/show.php и т.д. Это упростит навигацию.

Дополнительные каталоги

core/ – здесь логика роутинга, базовые контроллеры, загрузка конфигурации. Например: Router.php, BaseController.php.

public/ – единственная точка входа в проект. В ней хранятся index.php, стили, скрипты и изображения. Всё остальное должно быть недоступно напрямую.

Отдельно вынеси config/ – база данных, настройки путей и прочее. Конфиги – не место для логики, только массивы и константы.

И не забывай про автозагрузку: пропиши правила в composer.json или сделай свой лоадер, чтобы классы не подключались вручную.

Реализация маршрутизации и подключение контроллеров к шаблонам и модели

Сначала пропиши правила маршрутов в одном файле, например, routes.php. Пример структуры:


return [
'/' => ['controller' => 'HomeController', 'action' => 'index'],
'/post' => ['controller' => 'PostController', 'action' => 'show'],
'/admin/create' => ['controller' => 'AdminController', 'action' => 'create'],
];

Подключи маршруты в точке входа, обычно это index.php:


$routes = require 'routes.php';
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

Проверь наличие маршрута и вызови нужный метод:


if (array_key_exists($uri, $routes)) {
$controllerName = 'App\\Controllers\\' . $routes[$uri]['controller'];
$action = $routes[$uri]['action'];
$controller = new $controllerName;
$controller->$action();
} else {
http_response_code(404);
echo 'Страница не найдена';
}

Внутри контроллера подключай шаблон через отдельный метод:


public function index() {
$posts = $this->model->getAll();
$this->render('home/index', ['posts' => $posts]);
}

Метод render можно описать так:


protected function render($view, $data = []) {
extract($data);
require "../views/{$view}.php";
}

В модели избегай SQL внутри контроллера. Пример:


public function getAll() {
$stmt = $this->db->query("SELECT * FROM posts ORDER BY created_at DESC");
return $stmt->fetchAll();
}

Старайся разделять данные, отображение и логику маршрутов. Это упростит добавление новых страниц, правку кода и тестирование.