Сначала определи структуру. Разбей проект на три части: данные (модели), представление (шаблоны) и управление (контроллеры). Папки должны быть названы понятно: 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();
}
Старайся разделять данные, отображение и логику маршрутов. Это упростит добавление новых страниц, правку кода и тестирование.