Filbaseret motor i PHP

Vi implementerer en site-motor, som vil tillade os at oprette en skabelonfil, hvori forskelligt indhold vil blive inkluderet afhængigt af URL'en.

Lad strukturen af vores side se ud som følger:

layout.php<!DOCTYPE html>
<html>
  <head>
    <title>title</title>
  </head>
  <body>
    <header>
      header
    </header>
    <main>
      content
    </main>
    <header>
      footer
    </header>
  </body>
</html>

Lad os på det sted, hvor indholdsindsættelsen skal foregå, indsætte en selvopfundet kommando til indsættelse, for eksempel sådan en her: {{ content }}. Lad os ændre vores sites skabelon:

layout.php<!DOCTYPE html>
<html>
  <head>
    <title>title</title>
  </head>
  <body>
    <header>
      header
    </header>
    <main>
      {{ content }}
    </main>
    <header>
      footer
    </header>
  </body>
</html>

Lad os nu oprette mappen view, hvor vi vil placere indholdsfilene. Enten direkte i denne mappe eller i undermapper.

Den første fil vil være sådan:

view/page1.php<div>
  content 1
</div>

Den anden fil vil være sådan:

view/dir/page2.php<div>
  content 2
</div>

Den tredje fil vil være sådan:

view/dir/sub/page3.php<div>
  content 3
</div>

Lad os nu sørge for, at den relevante fil bliver hentet baseret på URL'en fra adresselinjen. I vores tilfælde vil fil /page1 være den første fil, URL'en /dir/page2 - den anden, og URL'en /dir/sub/page3 - den tredje.

Lad os gå i gang med implementeringen. Til at starte med, i filen .htaccess, lad os sørge for, at alle anmodede adresser, bortset fra ressourcefiler, omdirigeres til siden index.php:

.htaccessRewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !\.(js|css|ico|jpg|png|gif)$
RewriteRule .+ index.php

På siden index.php henter vi den anmodede URL ind i en variabel:

index.php<?php
  $url = $_SERVER['REQUEST_URI'];
?>

Derefter henter vi tekst fra skabelonfilen:

index.php<?php
  $layout = file_get_contents('layout.php');
?>

Nu henter vi den relevante indholdsfil fra mappen view baseret på URL'en:

index.php<?php
  $content = file_get_contents('view' . $url . '.php');
?>

Lad os erstatte vores selvopfundne kommando i skabelonens tekst med det hentede indhold fra filen:

index.php<?php
  $layout = str_replace('{{ content }}', $content, $layout);
?>

Lad os sende skabelonfilen med den indsatte indhold til browseren:

index.php<?php
  echo $layout;
?>

Lad os samle alt og få følgende kode:

index.php<?php
  $url = $_SERVER['REQUEST_URI'];
  
  $layout  = file_get_contents('layout.php');
  $content = file_get_contents('view' . $url . '.php');
  
  $layout = str_replace('{{ content }}', $content, $layout);
  
  echo $layout;
?>
Задание 1

Implementer den beskrevne filbaserede motor.