نمط القوالب: فصل المنطق عن العرض
انقلوا منطق الأعمال إلى ملفات PHP وحافظوا على نظافة قوالب HTML
نمط القوالب: فصل المنطق عن العرض درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 الأصلية. فكّر في استخدام Twig أو Blade عندما:
- تريد إجراء escaping تلقائيًا بشكل افتراضي
- يحتاج المصممون إلى تعديل القوالب من دون معرفة PHP
- تحتاج إلى توريث القوالب ووحدات الماكرو
- يحتوي المشروع على عروض كثيرة وينمو حجمه
مثال على Twig
يوفر Twig، المستخدم مع Symfony، صيغة واضحة مع إجراء escaping تلقائي:
<?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بنية مجلدات MVC
تخطيط MVC مصغّر لمشروعات 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';
}مبدأ المسؤولية الواحدة
ينبغي أن يكون لكل ملف سبب واحد للتغيير:
- Model: لا يتغير إلا عند تغيّر بنية البيانات أو منطق الاستعلام
- Controller: لا يتغير إلا عند تغيّر منطق معالجة الطلبات
- View: لا يتغير إلا عند تغيّر واجهة المستخدم أو التخطيط
يسهّل ذلك اختبار كل جزء وصيانته بشكل مستقل.
تحقق سريع
ما الفائدة الأساسية من فصل منطق PHP عن تعليمات HTML البرمجية الخاصة بالعرض؟
مراجعة: نمط القوالب
أهم النقاط:
- شغّل المنطق بأكمله أولًا، ثم أخرج HTML
- افصل التطبيق إلى ملفات للمتحكم والعرض
- استخدم دالة render() مع extract()
- يلتقط التخزين المؤقت للإخراج HTML المُصيّر
- فكّر في استخدام Twig/Blade للمشروعات الأكبر
- يوجّه المتحكم الأمامي جميع الطلبات إلى المعالجات
الأسئلة الشائعة
هل درس «نمط القوالب: فصل المنطق عن العرض» مجاني؟
نعم — نص درس «نمط القوالب: فصل المنطق عن العرض» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «نمط القوالب: فصل المنطق عن العرض»؟
انقلوا منطق الأعمال إلى ملفات PHP وحافظوا على نظافة قوالب HTML تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «نمط القوالب: فصل المنطق عن العرض»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- وسوم PHP وبنية التضمين
- إنشاء HTML ديناميكي باستخدام حلقات PHP
- تضمين الملفات واستلزامها
- نمط القوالب: فصل المنطق عن العرض