Файлов двигател в PHP

Ще реализираме двигател за сайт, който ще ни позволи да направим шаблонен файл, към който в зависимост от URL ще се включва различно съдържание.

Нека структурата на нашата страница изглежда по следния начин:

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

Нека на мястото, където трябва да се вмъква съдържанието, вмъкнем някаква команда, която сме измислили за вмъкване, например такава: {{ content }}. Нека променим шаблона на нашия сайт:

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

Нека сега направим папка view, в която ще разполагаме файловете със съдържание. Директно в тази папка или в подпапки.

Първият файл ще бъде такъв:

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

Вторият файл ще бъде такъв:

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

Третият файл ще бъде такъв:

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

Нека сега направим така, че чрез URL от адресната лента да се извлича съответният файл. В нашия случай при урл /page1 ще бъде първият файл, при урл /dir/page2 - вторият, и при урл /dir/sub/page3 - третият.

Да започнем реализацията. Първо, във файла .htaccess ще направим така, че всички заявени адреси, освен файловете с ресурси, да се пренасочват към страницата index.php:

.htaccessRewriteEngine On
RewriteBase /

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

На страницата index.php ще получим в променлива заявения URL:

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

След това ще получим текста на файла с шаблона:

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

Сега чрез URL ще получим от папката view съответния файл със съдържание:

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

Нека заменим в текста на шаблона измислената от нас команда с полученото от файла съдържание:

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

Ще изведем в браузъра файла на шаблона с поставеното съдържание:

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

Нека съберем всичко заедно и ще получим следния код:

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

Реализирайте описания файлов двигател.