مستودع أحادي مع PHP: تنظيم الكود عمليًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا المستودع الأحادي في PHP؟

\n

غالبًا ما يواجه تطوير تطبيقات PHP المعقدة (CRM، SaaS، الأطر) معضلة: تخزين كل الكود في مستودع واحد (مستودع أحادي) أو تقسيمه إلى العديد من الخدمات المصغرة والحزم. المستودع الأحادي (monorepo) مع PHP هو استراتيجية يتم فيها وضع عدة مشاريع مترابطة (مكتبات، وحدات، تطبيقات) في مستودع Git واحد.

\n

عمليًا، يوفر هذا:

\n
    \n
  • تاريخ تغييرات موحد — يسهل تتبع كيفية تأثير تغيير في حزمة واحدة على أخرى.
  • \n
  • إعداد مبسط لـ CI/CD — خط أنابيب واحد لبناء واختبار جميع المكونات.
  • \n
  • تقليل التكرار — إعدادات مشتركة، نصوص برمجية، وتبعيات.
  • \n
  • تكرار سريع — لا حاجة لنشر الحزم في Packagist للاختبار المحلي.
  • \n
\n

ومع ذلك، يتطلب المستودع الأحادي انضباطًا. بدون تنظيم صحيح للكود، يتحول إلى "وحدة سباغيتي". في هذه المقالة، سنناقش الخطوات العملية لتنظيم مشروع PHP في مستودع أحادي.

\n\n

1. هيكل الدلائل للمستودع الأحادي

\n

المبدأ الأساسي هو الفصل الواضح بين الحزم والتطبيقات. لننظر إلى مثال على بنية نموذجية:

\n\n
project-root/\n├── apps/\n│   ├── web/                  # تطبيق ويب (Symfony/Laravel)\n│   │   ├── public/\n│   │   ├── src/\n│   │   └── composer.json\n│   └── api/                  # تطبيق API (Lumen/Slim)\n│       ├── public/\n│       ├── src/\n│       └── composer.json\n├── packages/\n│   ├── core/                 # النواة (واجهات مشتركة، كيانات)\n│   │   ├── src/\n│   │   └── composer.json\n│   ├── billing/              # وحدة الفوترة\n│   │   ├── src/\n│   │   └── composer.json\n│   └── notifications/        # وحدة الإشعارات\n│       ├── src/\n│       └── composer.json\n├── tools/                    # نصوص التطوير (PHP-CS-Fixer, PHPStan)\n├── composer.json             # البيان الجذري\n└── phpstan.neon              # إعدادات التحليل العامة
\n\n

لاحظ: كل حزمة في packages/ هي مكتبة Composer كاملة مع ملف composer.json الخاص بها. هذا يسمح بعزل التبعيات واختبارها بشكل منفصل.

\n\n

مثال على composer.json للحزمة core

\n
{\n    "name": "myproject/core",\n    "type": "library",\n    "autoload": {\n        "psr-4": {\n            "MyProject\\\\Core\\\\": "src/"\n        }\n    },\n    "require": {\n        "php": ">=8.1"\n    },\n    "extra": {\n        "branch-alias": {\n            "dev-main": "1.x-dev"\n        }\n    }\n}
\n\n

2. إدارة التبعيات عبر Composer

\n

ملف composer.json الجذري هو قلب المستودع الأحادي. يحتوي على:

\n
    \n
  • قائمة بجميع الحزم المتصلة محليًا (عبر مستودع path).
  • \n
  • تبعيات التطوير للمشروع بأكمله (PHPUnit, PHPStan, GrumPHP).
  • \n
  • نصوص للأتمتة (التحليل الثابت، الاختبارات).
  • \n
\n\n

مثال على composer.json الجذري

\n
{\n    "name": "myproject/monorepo",\n    "type": "project",\n    "repositories": [\n        {\n            "type": "path",\n            "url": "packages/*",\n            "options": {\n                "symlink": true\n            }\n        }\n    ],\n    "require": {\n        "myproject/core": "@dev",\n        "myproject/billing": "@dev",\n        "myproject/notifications": "@dev"\n    },\n    "require-dev": {\n        "phpunit/phpunit": "^10.0",\n        "phpstan/phpstan": "^1.10",\n        "friendsofphp/php-cs-fixer": "^3.0"\n    },\n    "autoload": {\n        "psr-4": {\n            "MyProject\\\\": "packages/*/src/"\n        }\n    },\n    "scripts": {\n        "test": "phpunit",\n        "analyse": "phpstan analyse",\n        "cs-fix": "php-cs-fixer fix"\n    }\n}
\n\n

النقاط الرئيسية:

\n
    \n
  • symlink: true

المدونات

توصيات الكتب