Bestandengestuurde engine in PHP

We implementeren een website-engine die ons in staat stelt een sjabloonbestand te maken, waaraan afhankelijk van de URL verschillende inhoud wordt toegevoegd.

Laat de structuur van onze pagina er als volgt uitzien:

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

Laten we op de plaats waar de inhoud moet worden ingevoegd, een door ons bedachte opdracht voor invoeging plaatsen, bijvoorbeeld deze: {{ content }}. Laten we het sjabloon van onze website wijzigen:

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

Laten we nu een map view maken, waarin we de inhoudsbestanden plaatsen. Direct in deze map of in submapen.

Het eerste bestand zal er als volgt uitzien:

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

Het tweede bestand zal er als volgt uitzien:

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

Het derde bestand zal er als volgt uitzien:

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

Laten we nu regelen dat via de URL uit de adresbalk het corresponderende bestand wordt opgehaald. In ons geval zal via de url /page1 het eerste bestand worden opgehaald, via url /dir/page2 - het tweede, en via url /dir/sub/page3 - het derde.

Laten we beginnen met de implementatie. Om te beginnen in het bestand .htaccess zorgen we ervoor dat alle aangevraagde adressen, behalve resourcebestanden, worden doorgestuurd naar de pagina index.php:

.htaccessRewriteEngine On
RewriteBase /

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

Op de pagina index.php halen we de aangevraagde URL op in een variabele:

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

Vervolgens halen we de tekst van het sjabloonbestand op:

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

Nu halen we via de URL uit de map view het corresponderende inhoudsbestand op:

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

Vervangen we in de sjabloontekst onze bedachte opdracht door de opgehaalde inhoud:

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

We geven het sjabloonbestand met de ingevoegde inhoud weer in de browser:

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

Laten we alles samenvoegen en we krijgen de volgende code:

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

Implementeer de beschreven bestandengestuurde engine.