Stosuj MVC gdy
- Projektujesz aplikacje webowa
- Zespół składa się z wielu osob (frontend/backend)
- Potrzebujesz testowalnej architektury
- Planujesz długoterminowe utrzymanie kodu
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:
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:
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:
Użytkownik --> [Kontroler] --> [Model] --> [Baza danych] | | v v [Widok] <-------- [Dane] | v UżytkownikModel (User.php):
<?phpclass 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):
<?phpclass 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
Rozważ alternatywy gdy
MVC to sprawdzony wzorzec architektoniczny, który:
Choc mały projekt może działać bez formalnego MVC, znajomosc tego wzorca jest niezbedna dla każdego programisty webowego.