Wzorzec szablonu: oddzielanie logiki od widoku
Przenoś logikę biznesową do plików PHP i zachowuj porządek w szablonach HTML
Wzorzec szablonu: oddzielanie logiki od widoku to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.
Dlaczego należy oddzielać logikę od widoku?
Umieszczanie zapytań do bazy danych, logiki biznesowej i kodu HTML w jednym pliku prowadzi do:
- Trudnego w czytaniu kodu spaghetti
- Problemów z testowaniem i ponownym używaniem logiki
- Błędów bezpieczeństwa wynikających z pomijania walidacji
Rozwiązanie: każdą odpowiedzialność należy umieścić we własnej warstwie.
Prosty wzorzec szablonu
Najpierw wykonaj całą logikę PHP, a następnie wygeneruj kod HTML:
<?php
// --- LOGIC (top) ---
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user = getUserById($userId);
if (!$user) {
http_response_code(404);
require '404.php';
exit;
}
$pageTitle = 'Profile: ' . $user['name'];
// --- VIEW (bottom) ---
require 'layout/header.php';
?>
<main>
<h1><?= htmlspecialchars($user['name']) ?></h1>
</main>
<?php require 'layout/footer.php'; ?>Rozdzielanie plików kontrolera i widoku
Podziel kod na plik kontrolera i plik widoku:
// profile.php (controller)
<?php
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user = getUserById($userId);
$posts = getPostsByUser($userId);
if (!$user) { require '404.php'; exit; }
require 'views/profile.view.php';
// views/profile.view.php (view) — only HTML and echoes
// No DB calls allowed here!Przygotowywanie danych widoku
Sformatuj wszystkie dane w warstwie logiki przed przekazaniem ich do widoku:
<?php
$user = getUserById($id);
$viewData = [
'userName' => htmlspecialchars($user['name']),
'avatarUrl' => $user['avatar'] ?? '/default.png',
'joinedDate' => date('F Y', strtotime($user['created_at'])),
'isAdmin' => in_array('admin', $user['roles']),
];
extract($viewData); // Makes $userName, $avatarUrl, etc.
require 'views/profile.view.php';Wzorzec funkcji szablonu
Umieść renderowanie widoku w funkcji, aby ułatwić ponowne używanie kodu:
<?php
function render(string $view, array $data = []): void {
extract($data); // Create variables from array
require __DIR__ . '/views/' . $view . '.php';
}
// Usage:
render('profile', [
'name' => $user['name'],
'email' => $user['email'],
]);Silnik szablonów z buforowaniem danych wyjściowych
Wyrenderuj szablon i zwróć go jako ciąg znaków:
<?php
function renderToString(string $view, array $data = []): string {
extract($data);
ob_start();
require __DIR__ . '/views/' . $view . '.php';
return ob_get_clean();
}
$html = renderToString('email/welcome', ['name' => 'Alice']);
mail($to, 'Welcome!', $html, 'Content-Type: text/html');Kiedy używać silnika szablonów
W przypadku prostych stron natywny system szablonów PHP jest wystarczający. Rozważ użycie Twig lub Blade, gdy:
- Chcesz, aby dane były domyślnie automatycznie zabezpieczane
- Projektanci muszą edytować szablony bez znajomości PHP
- Potrzebujesz dziedziczenia szablonów i makr
- Projekt ma wiele widoków i znacznie się rozrasta
Przykład Twig
Twig, używany przez Symfony, oferuje przejrzystą składnię z automatycznym zabezpieczaniem danych:
<?php
// After: composer require twig/twig
$loader = new Twig\Loader\FilesystemLoader('/templates');
$twig = new Twig\Environment($loader, ['cache' => '/tmp/twig']);
echo $twig->render('profile.html.twig', [
'user' => $user,
'posts' => $posts,
]);
// profile.html.twig:
// <h1>{{ user.name }}</h1> -- auto-escaped by defaultStruktura katalogów MVC
Minimalny układ MVC dla projektów w czystym PHP:
project/
controllers/
UserController.php -- handles request, calls model
models/
User.php -- database queries
views/
users/
profile.php -- display only, no logic
public/
index.php -- front controller (router)Wzorzec front controller
Przekieruj wszystkie żądania przez jeden punkt wejścia:
<?php
// public/index.php (front controller)
require __DIR__ . '/../vendor/autoload.php';
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = require '../routes.php';
if (isset($routes[$uri])) {
[$controller, $action] = $routes[$uri];
(new $controller)->$action();
} else {
http_response_code(404);
require '../views/404.php';
}Zasada pojedynczej odpowiedzialności
Każdy plik powinien mieć tylko jeden powód do zmiany:
- Model: zmienia się tylko wtedy, gdy zmienia się struktura danych lub logika zapytań
- Kontroler: zmienia się tylko wtedy, gdy zmienia się logika obsługi żądań
- Widok: zmienia się tylko wtedy, gdy zmienia się interfejs użytkownika lub układ strony
Dzięki temu każdą część można łatwiej niezależnie testować i utrzymywać.
Szybkie sprawdzenie
Jaka jest główna korzyść z oddzielenia logiki PHP od kodu HTML widoku?
Podsumowanie: wzorzec szablonu
Najważniejsze wnioski:
- Najpierw wykonuj całą logikę, a następnie generuj kod HTML
- Rozdzielaj kod na pliki kontrolera i widoku
- Używaj funkcji render() razem z extract()
- Buforowanie danych wyjściowych przechwytuje wyrenderowany kod HTML
- W przypadku większych projektów rozważ użycie Twig lub Blade
- Front controller przekazuje wszystkie żądania do modułów obsługi
Często zadawane pytania
Czy lekcja „Wzorzec szablonu: oddzielanie logiki od widoku” jest bezpłatna?
Tak — pełny tekst „Wzorzec szablonu: oddzielanie logiki od widoku” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec szablonu: oddzielanie logiki od widoku”?
Przenoś logikę biznesową do plików PHP i zachowuj porządek w szablonach HTML Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć PHP Academy?
Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Wzorzec szablonu: oddzielanie logiki od widoku”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?
Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Znaczniki PHP i składnia osadzania
- Dynamiczny kod HTML z pętlami PHP
- Dołączanie i wymaganie plików
- Wzorzec szablonu: oddzielanie logiki od widoku