0Pricing
PHP Academy · Lekcja

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 default

Struktura 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

  1. Znaczniki PHP i składnia osadzania
  2. Dynamiczny kod HTML z pętlami PHP
  3. Dołączanie i wymaganie plików
  4. Wzorzec szablonu: oddzielanie logiki od widoku
← Powrót do PHP Academy