File-Based Engine in 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 ที่กรอกในแถบที่อยู่ ในกรณีของเรา URL /page1 จะดึงไฟล์แรก, URL /dir/page2 จะดึงไฟล์ที่สอง, และ URL /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');
?>

คราวนี้เราจะดึงไฟล์เนื้อหาที่เกี่ยวข้องจากโฟลเดอร์ view ตาม URL:

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

ให้คุณนำ File-Based Engine ตามที่อธิบายไปใช้งาน