انتقل إلى محتوى الدرس
الدرس 93
دورة PHP

هيكلة تطبيق الويب وإعدادات البيئة والموجه المركزي Router في PHP 8PHP Web Application Structure Environment Config and Routing

نظّم مشروع تطبيق ويب احترافي في PHP 8 بفصل مجلد public عن الكود المصدري وإدارة إعدادات البيئة وبناء موجه مركزي للروابط.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

في تطبيقات الويب الاحترافية بلغة PHP، يُضبط مجلد public/ فقط ليكون المسار العام للخادم (DocumentRoot)، مما يحمي ملفات الإعدادات والكلاسات خارج النطاق العام.

  • ضع ملف نقطة الدخول index.php وملفات التنسيق والصور العامة فقط داخل مجلد public/.
  • احفظ الأصناف البرمجية في src/، وقوالب العرض في views/، والإعدادات في config/ خارج مجلد public/.
  • حتى لو حدث خطأ في إعدادات الخادم، لن يتمكن أي زائر أبداً من الوصول المباشر لملفات الكود أو الإعدادات.

تصعد الدالة dirname(__DIR__) مستوى واحداً للأعلى من مجلد public/ لتعريف المسار الجذري BASE_PATH بأمان.

مخطط توضيحي: محاكي الموجه المركزي Front Controller وتوجيه الروابط في PHP 8
PHP
<?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
<?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
<?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".

مخطط تدفق التنفيذ العملي لقسم قراءة مسار الرابط النظيف وطريقة الطلب HTTP في لغة PHP
PHP
<?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
<?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.phpYes (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
.envNo (Git-ignored)Local/production secrets and credentials

PHP
<?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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 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 ويرسلها إلى متصفح العميل بعد التنفيذ.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. أنشئ ملف PHP محلياً ونفّذ المثال البرمجي المشروح في قسم فصل مجلد العرض العام public عن الكود المصدري للتحقق من المخرجات.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم إدارة بيانات الاتصال السرية عبر متغيرات البيئة وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 1أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

أي مجلد يجب ضبطه ليكون مسار العرض العام (DocumentRoot) في خادم الويب لتطبيق PHP حديث؟

تعريض مجلد public/ فقط يحمي مجلدات config/ وsrc/ وملف .env من الوصول المباشر.

02

ماذا ترجع الدالة parse_url("/products/list?category=books", PHP_URL_PATH)؟

يستخرج الثابت PHP_URL_PATH مسار الرابط فقط بدون معاملات الاستعلام.

03

ما الهدف الأساسي من نمط الموجه الأمامي (Front Controller) في ملف public/index.php؟

توحيد نقطة الدخول يجمع التحميل التلقائي والجلسات والأمان والتوجيه في مكان واحد.

04

كيف يجب إدارة كلمات مرور قاعدة البيانات والمفاتيح السرية بين بيئتي التطوير والإنتاج؟

متغيرات البيئة تحمي البيانات السرية من التسرب في سجل Git.

05

ما رمز حالة HTTP الذي يجب أن يرسله الموجه في المسار الافتراضي default عند عدم تطابق أي رابط؟

يخبر الرمز 404 المتصفح ومحركات البحث بأن المسار المطلوب غير موجود.

06

ماذا ترجع الدالة dirname(__DIR__) عند استدعائها داخل الملف /var/www/app/public/index.php؟

الثابت __DIR__ يرجع مجلد public والدالة dirname() تصعد للمجلد الأب.

07

لماذا يجب أن يجمع مفتاح التوجيه بين طريقة الطلب $_SERVER["REQUEST_METHOD"] والمسار معاً (مثل "POST /login")؟

يميز التوجيه القياسي بين طلب العرض GET وطلب إرسال البيانات POST لنفس الرابط.

08

أي أمر في الطرفية يشغّل خادم PHP المدمج للتطوير مع تحديد مجلد public/ كجذر للعرض؟

يحدد الخيار -t مجلد الجذر العام ليكون public/.