Pattern dei template: separare la logica dalla vista
Spostare la logica di business nei file PHP e mantenere puliti i template HTML.
Pattern dei template: separare la logica dalla vista è una lezione PHP Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento PHP Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso PHP Academy include 4 lezioni in totale.
Perché separare la logica dalla vista?
Mescolare query al database, logica di business e HTML nello stesso file porta a:
- Codice spaghetti difficile da leggere
- Difficoltà nel testare e riutilizzare la logica
- Errori di sicurezza quando la convalida viene omessa
La soluzione consiste nel mantenere ogni responsabilità nel proprio livello.
Il pattern di template semplice
Esegua prima tutta la logica PHP, quindi produca l'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'; ?>Separazione dei file controller e view
Divida il codice in un file controller e un file view:
// 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!Preparazione dei dati per la vista
Formatti tutti i dati nel livello della logica prima di inviarli alla vista:
<?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';Pattern delle funzioni di template
Racchiuda il rendering della vista in una funzione per riutilizzarla più facilmente:
<?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'],
]);Motore di template con bufferizzazione dell'output
Renderizzi un template e lo restituisca come stringa:
<?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');Quando usare un motore di template
Per i siti semplici, il sistema di template nativo di PHP è sufficiente. Prenda in considerazione Twig o Blade quando:
- Desidera l'escaping automatico per impostazione predefinita
- I designer devono modificare i template senza conoscere PHP
- Ha bisogno dell'ereditarietà dei template e delle macro
- Il progetto ha molte viste e cresce considerevolmente
Esempio con Twig
Twig, utilizzato da Symfony, offre una sintassi chiara con escaping automatico:
<?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 defaultStruttura delle directory MVC
Un layout MVC minimo per progetti PHP senza framework:
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)Pattern del front controller
Instradi tutte le richieste attraverso un unico punto di ingresso:
<?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';
}Principio di responsabilità singola
Ogni file dovrebbe avere un solo motivo per cambiare:
- Model: cambia solo quando cambiano la struttura dei dati o la logica delle query
- Controller: cambia solo quando cambia la logica di gestione delle richieste
- View: cambia solo quando cambiano l'interfaccia utente o il layout
In questo modo ogni componente è più facile da testare e mantenere in modo indipendente.
Verifica rapida
Qual è il vantaggio principale della separazione tra la logica PHP e il codice HTML della vista?
Riepilogo: pattern di template
Concetti chiave:
- Esegua prima tutta la logica, quindi produca l'HTML
- Separi il codice in file controller e view
- Utilizzi una funzione render() con extract()
- La bufferizzazione dell'output acquisisce l'HTML renderizzato
- Prenda in considerazione Twig/Blade per i progetti più grandi
- Il front controller instrada tutte le richieste ai gestori
Domande Frequenti
La lezione «Pattern dei template: separare la logica dalla vista» è gratuita?
Sì — il testo completo di «Pattern dei template: separare la logica dalla vista» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso PHP Academy, passa a CoddyKit PRO. Il corso PHP Academy include 4 lezioni in totale.
Cosa imparerò in «Pattern dei template: separare la logica dalla vista»?
Spostare la logica di business nei file PHP e mantenere puliti i template HTML. Eserciti PHP Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare PHP Academy?
Non è richiesta alcuna esperienza precedente. PHP Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Pattern dei template: separare la logica dalla vista»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione PHP Academy?
Sì. Ogni lezione PHP Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Tag PHP e sintassi di incorporamento
- HTML dinamico con i cicli PHP
- Inclusione e richiesta di file
- Pattern dei template: separare la logica dalla vista