Engine trên file trong PHP
Chúng ta sẽ triển khai một engine cho website, cho phép chúng ta tạo một file template, vào đó, tùy thuộc vào URL, nội dung khác nhau sẽ được kết nối.
Giả sử cấu trúc trang của chúng ta trông như sau:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
content
</main>
<header>
footer
</header>
</body>
</html>
Hãy đặt tại vị trí cần chèn nội dung một lệnh do chúng ta
tự nghĩ ra để chèn, ví dụ như sau:
{{ content }}. Hãy thay đổi template của website chúng ta:
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
<header>
header
</header>
<main>
{{ content }}
</main>
<header>
footer
</header>
</body>
</html>
Bây giờ hãy tạo thư mục view, vào đó
chúng ta sẽ đặt các file nội dung. Ngay trong thư mục này
hoặc trong các thư mục con.
File đầu tiên sẽ như sau:
<div>
content 1
</div>
File thứ hai sẽ như sau:
<div>
content 2
</div>
File thứ ba sẽ như sau:
<div>
content 3
</div>
Bây giờ hãy làm sao để theo URL
từ thanh địa chỉ, file tương ứng
sẽ được lấy về. Trong trường hợp của chúng ta, theo URL /page1
sẽ là file đầu tiên, theo URL /dir/page2
- file thứ hai, và theo URL /dir/sub/page3
- file thứ ba.
Hãy bắt đầu triển khai. Đầu tiên, trong file
.htaccess, hãy làm sao để tất cả các địa chỉ được yêu cầu,
ngoại trừ các file tài nguyên, được chuyển hướng
về trang index.php:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !\.(js|css|ico|jpg|png|gif)$
RewriteRule .+ index.php
Trên trang index.php, hãy lấy URL được yêu cầu vào một biến:
<?php
$url = $_SERVER['REQUEST_URI'];
?>
Sau đó, lấy nội dung văn bản của file template:
<?php
$layout = file_get_contents('layout.php');
?>
Bây giờ, dựa vào URL, hãy lấy file nội dung tương ứng
từ thư mục view:
<?php
$content = file_get_contents('view' . $url . '.php');
?>
Hãy thay thế lệnh do chúng ta tự nghĩ ra trong văn bản template bằng nội dung lấy được từ file:
<?php
$layout = str_replace('{{ content }}', $content, $layout);
?>
Hãy xuất ra trình duyệt file template với nội dung đã được thay thế:
<?php
echo $layout;
?>
Tổng hợp tất cả lại, chúng ta có đoạn mã sau:
<?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;
?>
Hãy triển khai engine trên file như đã mô tả.