PHP Academy · Lektion

Template-mønster: Adskillelse af logik og visning

Flyt forretningslogik til PHP-filer, og hold HTML-templates rene.

Lektion 4 af 413 trin

Template-mønster: Adskillelse af logik og visning er en gratis PHP Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i PHP Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. PHP Academy-kurset indeholder 4 lektioner i alt.

Hvorfor adskille logik fra visning?

Hvis databaseforespørgsler, forretningslogik og HTML blandes i den samme fil, fører det til:

  • Vanskeligt læselig spaghettikode
  • Det bliver vanskeligt at teste og genbruge logik
  • Sikkerhedsfejl, når validering springes over

Løsningen er at holde hvert ansvarsområde i sit eget lag.

Det enkle skabelonmønster

Kør al PHP-logik først, og generér derefter 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'; ?>

Adskillelse af controller- og visningsfiler

Opdel koden i en controllerfil og en visningsfil:

// 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!

Forbered visningsdata

Formatér alle data i logiklaget, før de sendes til visningen:

<?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';

Mønster med skabelonfunktion

Indpak gengivelse af visningen i en funktion for at gøre genbrug enklere:

<?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'],
]);

Skabelonmotor med outputbuffering

Gengiv en skabelon, og returnér den som en streng:

<?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');

Hvornår skal du bruge en skabelonmotor?

Til enkle websteder er PHP's indbyggede skabelonsystem fint. Overvej Twig eller Blade, når:

  • Du vil have automatisk escaping som standard
  • Designere skal kunne redigere skabeloner uden kendskab til PHP
  • Du har brug for skabelonnedarvning og makroer
  • Projektet har mange visninger og vokser sig stort

Twig-eksempel

Twig (bruges af Symfony) giver en ren syntaks med automatisk tegn-escaping:

<?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

MVC-mappestruktur

Et minimalt MVC-layout til almindelige PHP-projekter:

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)

Frontcontroller-mønster

Dirigér alle forespørgsler gennem et enkelt indgangspunkt:

<?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';
}

Princippet om enkelt ansvar

Hver fil bør kun have én årsag til at blive ændret:

  • Model: ændres kun, når datastrukturen eller forespørgselslogikken ændres
  • Controller: ændres kun, når logikken til håndtering af forespørgsler ændres
  • Visning: ændres kun, når brugergrænsefladen eller layoutet ændres

Det gør hver del lettere at teste og vedligeholde uafhængigt.

Hurtigt tjek

Hvad er den primære fordel ved at adskille PHP-logik fra HTML-kode til visningen?

Opsummering: Skabelonmønsteret

Vigtigste pointer:

  • Kør al logik først, og generér derefter HTML
  • Adskil koden i controller- og visningsfiler
  • Brug en render()-funktion sammen med extract()
  • Outputbuffering opsamler gengivet HTML
  • Overvej Twig eller Blade til større projekter
  • En frontcontroller dirigerer alle forespørgsler til behandlere
Gratis at komme i gang

Lær PHP med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
49
Lektioner
195

Ofte stillede spørgsmål

Er lektionen “Template-mønster: Adskillelse af logik og visning” gratis?

Ja — hele teksten til “Template-mønster: Adskillelse af logik og visning” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af PHP Academy-kurset, skal du opgradere til CoddyKit PRO. PHP Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Template-mønster: Adskillelse af logik og visning”?

Flyt forretningslogik til PHP-filer, og hold HTML-templates rene. Du øver dig i PHP Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på PHP Academy?

Der kræves ingen tidligere erfaring. PHP Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Template-mønster: Adskillelse af logik og visning”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne PHP Academy-lektion?

Ja. Alle PHP Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. PHP-tags og indlejringssyntaks
  2. Dynamisk HTML med PHP-løkker
  3. Inkludering og krævning af filer
  4. Template-mønster: Adskillelse af logik og visning
← Tilbage til PHP Academy