Skip to content

MVC - idea wzorca projektowego

This content is not available in your language yet.

MVC (Model-View-Controller) to jeden z najstarszych i najbardziej wpływowych wzorcow architektonicznych w historii programowania. Został opracowany w 1979 roku przez Trygve Reenskauga dla języka Smalltalk i od tego czasu stal się fundamentem wielu frameworkow webowych.

Główna idea MVC polega na separacji odpowiedzialności (Separation of Concerns) - podziale aplikacji na trzy współpracujące warstwy, z których każda odpowiada za odrebny aspekt działania systemu. Dzieki temu kod staje się bardziej czytelny, łatwiejszy w utrzymaniu i testowalny.

Model reprezentuje dane aplikacji oraz logike biznesowa. Odpowiada za:

  • Przechowywanie i zarzadzanie danymi
  • Walidacje reguł biznesowych
  • Komunikacje z baza danych
  • Powiadamianie widokow o zmianach danych

Model nie wie nic o sposobie prezentacji danych - jest całkowicie niezależny od warstwy wizualnej.

Widok odpowiada za prezentacje danych użytkownikowi. Jego zadania to:

  • Renderowanie interfejsu użytkownika
  • Wyswietlanie danych z modelu
  • Obsługa elementow graficznych (HTML, CSS, szablony)

Widok nie zawiera logiki biznesowej - jedynie pobiera dane z modelu i je wyświetla.

Kontroler pełni role posrednika miedzy uzytkownikiem a systemem. Odpowiada za:

  • Odbieranie żądań od użytkownika (np. klikniecia, formularze)
  • Interpretacje tych żądań
  • Wywoływanie odpowiednich metod modelu
  • Wybor właściwego widoku do wyświetlenia
  1. Użytkownik wysyła zadanie - np. klika przycisk lub wysyła formularz
  2. Kontroler odbiera zadanie - analizuje, co użytkownik chcę zrobic
  3. Kontroler komunikuje się z modelem - wywołuje metody modyfikujace lub pobierajace dane
  4. Model przetwarza dane - wykonuje logike biznesowa, walidacje, operacje na bazie
  5. Model zwraca wynik - dane trafiaja z powrotem do kontrolera
  6. Kontroler wybiera widok - decyduje, który szablon wyświetlić
  7. Widok renderuje dane - prezentuje wynik użytkownikowi
Użytkownik --> [Kontroler] --> [Model] --> [Baza danych]
| |
v v
[Widok] <-------- [Dane]
|
v
Użytkownik

Model (User.php):

<?php
class User {
private $db;
public function __construct($database) {
$this->db = $database;
}
public function getById($id) {
$stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
public function create($data) {
// Walidacja
if (empty($data['email'])) {
throw new Exception("Email jest wymagany");
}
// Zapis do bazy
$stmt = $this->db->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
return $stmt->execute([$data['name'], $data['email']]);
}
}

Kontroler (UserController.php):

<?php
class UserController {
private $userModel;
public function __construct($userModel) {
$this->userModel = $userModel;
}
public function show($id) {
$user = $this->userModel->getById($id);
if (!$user) {
return $this->render('404.php');
}
return $this->render('user/show.php', ['user' => $user]);
}
private function render($view, $data = []) {
extract($data);
include "views/{$view}";
}
}

Widok (views/user/show.php):

<!DOCTYPE html>
<html>
<head>
<title>Profil użytkownika</title>
</head>
<body>
<h1><?= htmlspecialchars($user['name']) ?></h1>
<p>Email: <?= htmlspecialchars($user['email']) ?></p>
</body>
</html>
projekt/
├── controllers/
│ ├── UserController.php
│ └── ProductController.php
├── models/
│ ├── User.php
│ └── Product.php
├── views/
│ ├── user/
│ │ ├── show.php
│ │ └── list.php
│ └── product/
│ └── show.php
└── index.php (router/front controller)

Stosuj MVC gdy

  • Projektujesz aplikacje webowa
  • Zespół składa się z wielu osob (frontend/backend)
  • Potrzebujesz testowalnej architektury
  • Planujesz długoterminowe utrzymanie kodu

Rozważ alternatywy gdy

  • Tworzysz bardzo prosty skrypt
  • Projekt ma kilkadziesiat linii kodu
  • Nie potrzebujesz interfejsu użytkownika
  • Piszesz jednorazowe narzedzie CLI
  • MVP (Model-View-Presenter) - Presenter zastepuje Controller, widok jest bardziej pasywny
  • MVVM (Model-View-ViewModel) - Popularny w Angular, Vue; ViewModel wiaze dane z widokiem
  • MVC2 - Wariant dla aplikacji webowych z jednym kontrolerem frontowym

MVC to sprawdzony wzorzec architektoniczny, który:

  • Separuje odpowiedzialności - każda warstwa ma jasno okreslona role
  • Ułatwia prace zespołowa - rozni programisci mogą pracowac nad roznymi warstwami
  • Zwieksza testowalnosc - można testowac model niezależnie od widoku
  • Poprawia utrzymywalnosc - zmiany w jednej warstwie nie wpływają na inne

Choc mały projekt może działać bez formalnego MVC, znajomosc tego wzorca jest niezbedna dla każdego programisty webowego.