MVC (Model-View-Controller) — это архитектурный шаблон, который разделяет приложение на три основных компонента: Модель (Model), Представление (View) и Контроллер (Controller). Это разделение помогает упростить управление кодом, облегчает тестирование и дает возможность параллельной разработки различных компонентов.
Основные компоненты MVC:
- Модель (Model): отвечает за бизнес-логику приложения, управление данными и взаимодействие с базами данных. Модель не знает о представлении и контроллере.
- Представление (View): отвечает за отображение данных пользователю. Оно получает данные из модели и отображает их в удобном для пользователя формате.
- Контроллер (Controller): служит посредником между моделью и представлением. Он обрабатывает входные данные от пользователя, взаимодействует с моделью и обновляет представление.
Пример структуры проекта
/project
/app
/controllers
UserController.php
/models
UserModel.php
/views
user
index.php
profile.php
/config
database.php
/public
index.php
1. Model (Модель)
Модель отвечает за работу с данными. В этом примере модель UserModel
взаимодействует с базой данных.
<?php
// app/models/UserModel.php
class UserModel {
private $db;
public function __construct($db) {
$this->db = $db;
}
// Получить всех пользователей
public function getUsers() {
$query = "SELECT * FROM users";
return $this->db->query($query)->fetchAll();
}
// Получить пользователя по ID
public function getUserById($id) {
$query = "SELECT * FROM users WHERE id = :id";
$stmt = $this->db->prepare($query);
$stmt->execute(['id' => $id]);
return $stmt->fetch();
}
}
2. View (Представление)
Представление отвечает за отображение данных. В этом примере два представления: index.php (список пользователей) и profile.php (профиль пользователя).
<?php
// app/views/user/index.php
echo "<h1>Список пользователей</h1>";
echo "<ul>";
foreach ($users as $user) {
echo "<li><a href='/user/profile/{$user['id']}'>{$user['name']}</a></li>";
}
echo "</ul>";
<?php
// app/views/user/profile.php
echo "<h1>Профиль пользователя</h1>";
echo "<p>Имя: {$user['name']}</p>";
echo "<p>Email: {$user['email']}</p>";
3. Controller (Контроллер)
Контроллер обрабатывает запросы пользователя, взаимодействует с моделью и передает данные в представление.
<?php
// app/controllers/UserController.php
class UserController {
private $model;
public function __construct($model) {
$this->model = $model;
}
// Показать список пользователей
public function index() {
$users = $this->model->getUsers();
include 'app/views/user/index.php';
}
// Показать профиль пользователя
public function profile($id) {
$user = $this->model->getUserById($id);
include 'app/views/user/profile.php';
}
}
4. Конфигурация и точка входа
Настройка базы данных и маршрутизация запросов.
<?php
// config/database.php
$host = 'localhost';
$dbname = 'test';
$user = 'root';
$pass = '';
try {
$db = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die("Ошибка подключения к базе данных: " . $e->getMessage());
}
<?php
// public/index.php
require '../config/database.php';
require '../app/models/UserModel.php';
require '../app/controllers/UserController.php';
// Создаем экземпляры модели и контроллера
$model = new UserModel($db);
$controller = new UserController($model);
// Обработка запросов
$action = $_GET['action'] ?? 'index';
$id = $_GET['id'] ?? null;
if ($action === 'profile' && $id) {
$controller->profile($id);
} else {
$controller->index();
}
5. Маршрутизация
Пример маршрутов:
-
/public/index.php
— список пользователей. -
/public/index.php?action=profile&id=1
— профиль пользователя с ID = 1.