0Pricing
PHP Academy · บทเรียน

รูปแบบเทมเพลต: แยกตรรกะออกจากมุมมอง

ย้ายตรรกะทางธุรกิจไปไว้ในไฟล์ PHP และทำให้เทมเพลต HTML สะอาด

รูปแบบเทมเพลต: แยกตรรกะออกจากมุมมอง เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงควรแยกตรรกะออกจากมุมมอง

การรวมคำสั่งฐานข้อมูล ตรรกะทางธุรกิจ และ HTML ไว้ในไฟล์เดียวกันนำไปสู่:

  • โค้ดพันกันที่อ่านได้ยาก
  • ความยากในการทดสอบและนำตรรกะกลับมาใช้ใหม่
  • ข้อผิดพลาดด้านความปลอดภัยเมื่อข้ามการตรวจสอบ

แนวทางแก้คือแยกแต่ละหน้าที่ไว้ในชั้นของตนเอง

รูปแบบแม่แบบอย่างง่าย

เรียกใช้ตรรกะ PHP ทั้งหมดก่อน แล้วจึงส่งออก HTML:

<?php
// --- LOGIC (top) ---
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user   = getUserById($userId);
if (!$user) {
    http_response_code(404);
    require '404.php';
    exit;
}
$pageTitle = 'Profile: ' . $user['name'];

// --- VIEW (bottom) ---
require 'layout/header.php';
?>
<main>
    <h1><?= htmlspecialchars($user['name']) ?></h1>
</main>
<?php require 'layout/footer.php'; ?>

การแยกไฟล์ตัวควบคุมและมุมมอง

แยกออกเป็นไฟล์ตัวควบคุมและไฟล์มุมมอง:

// profile.php (controller)
<?php
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user   = getUserById($userId);
$posts  = getPostsByUser($userId);

if (!$user) { require '404.php'; exit; }

require 'views/profile.view.php';

// views/profile.view.php (view) — only HTML and echoes
// No DB calls allowed here!

เตรียมข้อมูลมุมมอง

จัดรูปแบบข้อมูลทั้งหมดในชั้นตรรกะก่อนส่งไปยังมุมมอง:

<?php
$user = getUserById($id);

$viewData = [
    'userName'   => htmlspecialchars($user['name']),
    'avatarUrl'  => $user['avatar'] ?? '/default.png',
    'joinedDate' => date('F Y', strtotime($user['created_at'])),
    'isAdmin'    => in_array('admin', $user['roles']),
];

extract($viewData);  // Makes $userName, $avatarUrl, etc.
require 'views/profile.view.php';

รูปแบบฟังก์ชันแม่แบบ

ห่อการเรนเดอร์มุมมองไว้ในฟังก์ชันเพื่อให้นำกลับมาใช้ใหม่ได้สะดวกยิ่งขึ้น:

<?php
function render(string $view, array $data = []): void {
    extract($data);  // Create variables from array
    require __DIR__ . '/views/' . $view . '.php';
}

// Usage:
render('profile', [
    'name'   => $user['name'],
    'email'  => $user['email'],
]);

กลไกแม่แบบด้วยการบัฟเฟอร์ผลลัพธ์

เรนเดอร์แม่แบบและส่งคืนเป็นสตริง:

<?php
function renderToString(string $view, array $data = []): string {
    extract($data);
    ob_start();
    require __DIR__ . '/views/' . $view . '.php';
    return ob_get_clean();
}

$html = renderToString('email/welcome', ['name' => 'Alice']);
mail($to, 'Welcome!', $html, 'Content-Type: text/html');

ควรใช้กลไกแม่แบบเมื่อใด

สำหรับเว็บไซต์อย่างง่าย การใช้แม่แบบดั้งเดิมของ PHP ก็เพียงพอ ควรพิจารณาใช้ทวิกหรือเบลดเมื่อ:

  • ต้องการให้มีการหลีกเลี่ยงอักขระโดยอัตโนมัติเป็นค่าเริ่มต้น
  • นักออกแบบจำเป็นต้องแก้ไขแม่แบบโดยไม่ต้องมีความรู้ PHP
  • ต้องการการสืบทอดแม่แบบและแมโคร
  • โครงการมีมุมมองจำนวนมากและมีขนาดใหญ่ขึ้น

ตัวอย่างทวิก

ทวิก (ใช้โดยซิมโฟนี) มีไวยากรณ์ที่กระชับและหลีกเลี่ยงอักขระโดยอัตโนมัติ:

<?php
// After: composer require twig/twig
$loader = new Twig\Loader\FilesystemLoader('/templates');
$twig   = new Twig\Environment($loader, ['cache' => '/tmp/twig']);

echo $twig->render('profile.html.twig', [
    'user'  => $user,
    'posts' => $posts,
]);

// profile.html.twig:
// <h1>{{ user.name }}</h1>  -- auto-escaped by default

โครงสร้างไดเรกทอรีแบบเอ็มวีซี

โครงร่างเอ็มวีซีขั้นต่ำสำหรับโครงการ PHP แบบพื้นฐาน:

project/
  controllers/
    UserController.php   -- handles request, calls model
  models/
    User.php             -- database queries
  views/
    users/
      profile.php        -- display only, no logic
  public/
    index.php            -- front controller (router)

รูปแบบตัวควบคุมด้านหน้า

กำหนดเส้นทางคำขอทั้งหมดผ่านจุดเริ่มต้นเดียว:

<?php
// public/index.php (front controller)
require __DIR__ . '/../vendor/autoload.php';

$uri    = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = require '../routes.php';

if (isset($routes[$uri])) {
    [$controller, $action] = $routes[$uri];
    (new $controller)->$action();
} else {
    http_response_code(404);
    require '../views/404.php';
}

หลักความรับผิดชอบเดียว

แต่ละไฟล์ควรมีเหตุผลในการเปลี่ยนแปลงเพียงหนึ่งข้อ:

  • แบบจำลอง: เปลี่ยนเฉพาะเมื่อโครงสร้างข้อมูลหรือตรรกะการค้นหาเปลี่ยนแปลง
  • ตัวควบคุม: เปลี่ยนเฉพาะเมื่อตรรกะการจัดการคำขอเปลี่ยนแปลง
  • มุมมอง: เปลี่ยนเฉพาะเมื่อส่วนติดต่อผู้ใช้หรือโครงร่างเปลี่ยนแปลง

แนวทางนี้ทำให้แต่ละส่วนทดสอบและดูแลรักษาแยกจากกันได้ง่ายขึ้น

ตรวจสอบความเข้าใจ

ประโยชน์หลักของการแยกตรรกะ PHP ออกจากโค้ดมุมมอง HTML คืออะไร

ทบทวน: รูปแบบแม่แบบ

ประเด็นสำคัญ:

  • เรียกใช้ตรรกะทั้งหมดก่อน แล้วจึงส่งออก HTML
  • แยกเป็นไฟล์ตัวควบคุมและไฟล์มุมมอง
  • ใช้ฟังก์ชัน render() ร่วมกับ extract()
  • การบัฟเฟอร์ผลลัพธ์ช่วยเก็บ HTML ที่เรนเดอร์แล้ว
  • พิจารณาใช้ทวิกหรือเบลดสำหรับโครงการขนาดใหญ่
  • ตัวควบคุมด้านหน้าจะกำหนดเส้นทางคำขอทั้งหมดไปยังตัวจัดการ

คำถามที่พบบ่อย

บทเรียน “รูปแบบเทมเพลต: แยกตรรกะออกจากมุมมอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “รูปแบบเทมเพลต: แยกตรรกะออกจากมุมมอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบเทมเพลต: แยกตรรกะออกจากมุมมอง”

ย้ายตรรกะทางธุรกิจไปไว้ในไฟล์ PHP และทำให้เทมเพลต HTML สะอาด คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “รูปแบบเทมเพลต: แยกตรรกะออกจากมุมมอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม

ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แท็ก PHP และไวยากรณ์การฝังโค้ด
  2. HTML แบบไดนามิกด้วยลูป PHP
  3. การรวมและเรียกใช้ไฟล์
  4. รูปแบบเทมเพลต: แยกตรรกะออกจากมุมมอง
← กลับไปที่ PHP Academy