Motore basato su file in PHP

Implementeremo un motore per il sito che ci permetterà di creare un file template a cui, in base all'URL, verrà collegato contenuto diverso.

Supponiamo che la struttura della nostra pagina sia la seguente:

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

Inseriamo nel punto in cui dovrebbe avvenire l'inserimento del contenuto un comando da noi inventato per l'inserimento, ad esempio così: {{ content }}. Modifichiamo il template del nostro sito:

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

Creiamo ora una cartella view, in cui posizioneremo i file di contenuto. Direttamente in questa cartella o in sottocartelle.

Il primo file sarà così:

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

Il secondo file sarà così:

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

Il terzo file sarà così:

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

Facciamo ora in modo che in base all'URL della barra degli indirizzi venga caricato il file corrispondente. Nel nostro caso, all'URL /page1 corrisponderà il primo file, all'URL /dir/page2 - il secondo, e all'URL /dir/sub/page3 - il terzo.

Iniziamo l'implementazione. Per prima cosa, nel file .htaccess, facciamo in modo che tutti gli indirizzi richiesti, eccetto i file di risorse, vengano reindirizzati alla pagina index.php:

.htaccessRewriteEngine On
RewriteBase /

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

Nella pagina index.php, otteniamo in una variabile l'URL richiesto:

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

Poi otteniamo il testo del file del template:

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

Ora, in base all'URL, otteniamo dalla cartella view il file di contenuto corrispondente:

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

Sostituiamo nel testo del template il comando da noi inventato con il contenuto ottenuto dal file:

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

Stampiamo nel browser il file template con il contenuto sostituito:

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

Mettiamo tutto insieme e otteniamo il seguente codice:

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

Implementate il motore basato su file descritto.