Движок на файлах в 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

Реализуйте описанный движок на файлах.