Motor pe fișiere în PHP

Vom implementa un motor de site care ne va permite să creăm un fișier șablon, căruia în funcție de URL i se va conecta conținut variat.

Să presupunem că structura paginii noastre arată în felul următor:

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

Să inserăm în locul în care ar trebui să se facă inserarea conținutului o comandă inventată de noi pentru inserare, de exemplu astfel: {{ content }}. Să modificăm șablonul site-ului nostru:

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

Să creem acum directorul view, în care vom plasa fișierele de conținut. Direct în acest director sau în subdirectoare.

Primul fișier va fi astfel:

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

Al doilea fișier va fi astfel:

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

Al treilea fișier va fi astfel:

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

Să facem acum astfel încât după URL din bara de adrese să fie încărcat fișierul corespunzător. În cazul nostru, la URL-ul /page1 va fi primul fișier, la URL-ul /dir/page2 - al doilea, și la URL-ul /dir/sub/page3 - al treilea.

Să începem implementarea. Pentru început, în fișierul .htaccess vom face astfel încât toate adresele cerute, cu excepția fișierelor de resurse, să fie redirecționate către pagina index.php:

.htaccessRewriteEngine On
RewriteBase /

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

Pe pagina index.php vom obține într-o variabilă URL-ul solicitat:

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

Apoi vom obține textul fișierului cu șablonul:

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

Acum după URL vom obține din directorul view fișierul de conținut corespunzător:

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

Vom înlocui în textul șablonului comanda noastră inventată cu conținutul obținut din fișier:

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

Vom afișa în browser fișierul șablon cu șablonul substituit:

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

Vom aduna totul împreună și vom obține următorul cod:

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

Implementați motorul pe fișiere descris.