في هذا الدرس 6تصفّح المواضيع
في تطبيقات الويب الاحترافية بلغة PHP، يُضبط مجلد public/ فقط ليكون المسار العام للخادم (DocumentRoot)، مما يحمي ملفات الإعدادات والكلاسات خارج النطاق العام.
- ضع ملف نقطة الدخول
index.phpوملفات التنسيق والصور العامة فقط داخل مجلدpublic/. - احفظ الأصناف البرمجية في
src/، وقوالب العرض فيviews/، والإعدادات فيconfig/خارج مجلدpublic/. - حتى لو حدث خطأ في إعدادات الخادم، لن يتمكن أي زائر أبداً من الوصول المباشر لملفات الكود أو الإعدادات.
تصعد الدالة dirname(__DIR__) مستوى واحداً للأعلى من مجلد public/ لتعريف المسار الجذري BASE_PATH بأمان.
<?php
// File: public/index.php
define('BASE_PATH', dirname(__DIR__));
require BASE_PATH . '/vendor/autoload.php';
$config = require BASE_PATH . '/config/app.php';
echo "App Root: " . BASE_PATH . "\n";
echo "App Name: " . $config['name'] . "\n";
لا تكتب كلمات مرور قاعدة البيانات أو مفاتيح الواجهات داخل الكود المرفوع إلى Git أبداً؛ بل اقرأها من متغيرات البيئة عبر $_ENV أو getenv().
- ارفع ملف نموذج باسم
.env.exampleبالقيم الافتراضية، وأضف ملف.envالحقيقي إلى.gitignore. - اجمع قراءة متغيرات البيئة في ملف إعداد مركزي مثل
config/database.php. - حوّل القيم الرقمية أو المنطقية المقروءة من البيئة صراحةً (مثل
(int) ($_ENV["DB_PORT"] ?? 3306)).
يوفر معامل دمج الفارغ ?? قيماً افتراضية للتطوير المحلي مع قراءة قيم الخادم الحقيقية في بيئة الإنتاج.
<?php
// File: config/database.php
$dbConfig = [
'host' => $_ENV['DB_HOST'] ?? '127.0.0.1',
'port' => (int) ($_ENV['DB_PORT'] ?? 3306),
'name' => $_ENV['DB_DATABASE'] ?? 'closetag_app',
'debug' => ($_ENV['APP_DEBUG'] ?? 'false') === 'true',
];
echo "DSN: mysql:host={$dbConfig['host']};dbname={$dbConfig['name']}\n";
بدلاً من تعريض عشرات الملفات المنفصلة مثل login.php وprofile.php، يوجّه نمط الموجه الأمامي (Front Controller) كل الطلبات عبر نقطة دخول موحدة public/index.php.
- يوحّد بدء الجلسة، ورؤوس الأمان، ومعالجة الأخطاء، والتحميل التلقائي للكلاسات في ملف واحد.
- يمكن تشغيله محلياً بأمر الخادم المدمج:
php -S 127.0.0.1:8000 -t public. - يقضي تماماً على تكرار أكواد التهيئة في بداية كل صفحة.
يحصل كل طلب تلقائياً على رؤوس الحماية والوصول للجلسة قبل بدء مطابقة المسار.
<?php
// Bootstrap lifecycle inside public/index.php
session_start();
header('X-Frame-Options: SAMEORIGIN');
header('X-Content-Type-Options: nosniff');
$uri = $_SERVER['REQUEST_URI'] ?? '/dashboard';
echo "Front Controller initialized for: $uri\n";
لمطابقة المسارات بدقة، افصل معاملات الاستعلام عن $_SERVER["REQUEST_URI"] باستخدام parse_url(..., PHP_URL_PATH) ووحّد الشرطة المائلة النهائية.
- تستخرج الدالة
parse_url("/tasks?page=2", PHP_URL_PATH)المسار النظيف"/tasks"بدون معاملات البحث. - وحّد المسار عبر
rtrim($path, "/") ?: "/"حتى يتطابق/tasks/و/tasksمع نفس المسار. - ادمج طريقة الطلب (
GETأوPOST) مع المسار للفصل بين عرض الصفحة وإرسال النموذج.
تمت إزالة معاملات الاستعلام والشرطة المائلة الزائدة لإنتاج مفتاح المسار النظيف "GET /articles/list".
<?php
$rawUri = '/articles/list/?page=3&sort=desc';
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$rawPath = (string) parse_url($rawUri, PHP_URL_PATH);
$path = rtrim($rawPath, '/') ?: '/';
$routeKey = "$method $path";
echo "Normalized Route Key: $routeKey\n";
يوفر تعبير match في PHP 8 موجهاً سريعاً وصارماً يربط مفاتيح "METHOD /path" بالمتحكمات ويعالج حالة 404 Not Found بوضوح.
- يربط كل مسار في
matchزوج الطريقة والمسار بالمتحكم المسؤول عنه. - يضبط المسار الافتراضي
defaultرمز الحالةhttp_response_code(404)ويعرض صفحة 404 مخصصة. - يبقي التطبيقات الصغيرة والمتوسطة سريعة وسهلة التتبع.
لأن مفتاح المسار يتطابق بصرامة مع "POST /login"، يوجه الموجه الطلب إلى AuthController::authenticate.
<?php
$routeKey = 'POST /login';
$response = match ($routeKey) {
'GET /' => 'HomeController::index',
'GET /login' => 'AuthController::showLogin',
'POST /login' => 'AuthController::authenticate',
default => 'ErrorController::notFound404',
};
echo "Dispatched Handler: $response\n";
اتبع هذا التنظيم القياسي للمجلدات في مشاريع الويب الحديثة بلغة PHP 8 للفصل الواضح بين الإعدادات والمنطق البرمجي وقوالب العرض.
- اجعل مجلد
public/المجلد الوحيد المتاح للوصول عبر المتصفح. - حمّل الأصناف تلقائياً من مجلد
src/عبر معيار PSR-4 في Composer. - احفظ قوالب HTML داخل مجلد
views/ورمّز جميع المخرجات الديناميكية.
يختص كل مجلد رئيسي بمسؤولية محددة واحدة، بما يطابق معايير أطر العمل الحديثة.
| المجلد / الملف | متاح للمتصفح مباشرة؟ | المسؤولية الوظيفية |
|---|---|---|
public/index.php | Yes (Entry Point) | Front Controller, routing & asset hosting |
config/ | No (Private) | Database DSN, environment & app settings |
src/ | No (Private) | PSR-4 Controllers, Services & Models |
views/ | No (Private) | Escaped PHP/HTML layout and page templates |
.env | No (Git-ignored) | Local/production secrets and credentials |
<?php
$folders = [
'public' => 'Webroot (index.php, assets)',
'src' => 'PSR-4 Classes (Controllers, Models)',
'views' => 'HTML Templates',
'config' => 'Database & App Settings',
];
foreach ($folders as $dir => $purpose) {
echo str_pad($dir, 7) . " -> $purpose\n";
}
ملخص الدرس
حصاد الدرسمراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي
ماذا تعلّمت في هذا الدرس؟
اتبع هذا التنظيم القياسي للمجلدات في مشاريع الويب الحديثة بلغة PHP 8 للفصل الواضح بين الإعدادات والمنطق البرمجي وقوالب العرض. اجعل مجلد public/ المجلد الوحيد المتاح للوصول عبر المتصفح. حمّل الأصناف تلقائياً من مجلد src/ عبر معيار PSR-4 في Composer. احفظ قوالب HTML داخل مجلد views/ ورمّز جميع المخرجات الديناميكية.
سجّل الدخول لحفظ تقدمك
تابع إنجاز المواضيع والمصطلحات والمهام، وكمّل من آخر خطوة على أي جهاز.
المصطلحات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 App Config & Router هيكلة التطبيق والـ Router
- نظّم مشروع تطبيق ويب احترافي في PHP 8 بفصل مجلد public عن الكود المصدري وإدارة إعدادات البيئة وبناء موجه مركزي للروابط.
- للمراجعة
- 02 Separating public Webroot from Source فصل مجلد العرض العام public عن الكود المصدري
- المفهوم الأساسي لقسم فصل مجلد العرض العام public عن الكود المصدري في لغة PHP الحديثة.
- للمراجعة
- 03 Managing Credentials with Env Config إدارة بيانات الاتصال السرية عبر متغيرات البيئة
- الصياغة البرمجية والتطبيق العملي المباشر لقسم إدارة بيانات الاتصال السرية عبر متغيرات البيئة.
- للمراجعة
- 04 Front Controller Pattern in index.php نمط نقطة الدخول الموحدة Front Controller
- قواعد التحقق وأفضل الممارسات القياسية الخاصة بقسم نمط نقطة الدخول الموحدة Front Controller.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
الاختصارات4
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 01 PHP PHP
- PHP: Hypertext Preprocessor
- لغة البرمجة النصية على جانب الخادم لبناء تطبيقات الويب الديناميكية وواجهات البرمجة.
- للمراجعة
- 02 CLI CLI
- Command-Line Interface
- واجهة سطر الأوامر التي تتيح تشغيل ملفات PHP مباشرة عبر الطرفية.
- للمراجعة
- 03 FPM FPM
- FastCGI Process Manager
- مدير عمليات FastCGI عالي الأداء لمعالجة طلبات خادم الويب في PHP.
- للمراجعة
- 04 HTML HTML
- HyperText Markup Language
- لغة الترميز القياسية التي يولدها محرك PHP ويرسلها إلى متصفح العميل بعد التنفيذ.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم فصل مجلد العرض العام public عن الكود المصدري للتحقق من المخرجات.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم إدارة بيانات الاتصال السرية عبر متغيرات البيئة وقارن مخرجات التنفيذ.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
أي مجلد يجب ضبطه ليكون مسار العرض العام (DocumentRoot) في خادم الويب لتطبيق PHP حديث؟
تعريض مجلد public/ فقط يحمي مجلدات config/ وsrc/ وملف .env من الوصول المباشر.
ماذا ترجع الدالة parse_url("/products/list?category=books", PHP_URL_PATH)؟
يستخرج الثابت PHP_URL_PATH مسار الرابط فقط بدون معاملات الاستعلام.
ما الهدف الأساسي من نمط الموجه الأمامي (Front Controller) في ملف public/index.php؟
توحيد نقطة الدخول يجمع التحميل التلقائي والجلسات والأمان والتوجيه في مكان واحد.
كيف يجب إدارة كلمات مرور قاعدة البيانات والمفاتيح السرية بين بيئتي التطوير والإنتاج؟
متغيرات البيئة تحمي البيانات السرية من التسرب في سجل Git.
ما رمز حالة HTTP الذي يجب أن يرسله الموجه في المسار الافتراضي default عند عدم تطابق أي رابط؟
يخبر الرمز 404 المتصفح ومحركات البحث بأن المسار المطلوب غير موجود.
ماذا ترجع الدالة dirname(__DIR__) عند استدعائها داخل الملف /var/www/app/public/index.php؟
الثابت __DIR__ يرجع مجلد public والدالة dirname() تصعد للمجلد الأب.
لماذا يجب أن يجمع مفتاح التوجيه بين طريقة الطلب $_SERVER["REQUEST_METHOD"] والمسار معاً (مثل "POST /login")؟
يميز التوجيه القياسي بين طلب العرض GET وطلب إرسال البيانات POST لنفس الرابط.
أي أمر في الطرفية يشغّل خادم PHP المدمج للتطوير مع تحديد مجلد public/ كجذر للعرض؟
يحدد الخيار -t مجلد الجذر العام ليكون public/.