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

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

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

ابدأ الدورة
```html

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



في تطوير PHP الحديث، يبرز بشكل متزايد سؤال التنظيم الفعال للكود. النهج التقليدي مع مستودعات منفصلة متعددة (مستودعات متعددة) له عيوبه: تعقيد مزامنة الإصدارات، تكرار التهيئات، ومشاكل في إعادة الهيكلة. البديل هو المستودع الواحد (monorepo) — وهي استراتيجية يتم فيها تخزين جميع المشاريع والحزم والمكتبات ذات الصلة في مستودع واحد. في هذه المقالة، سنشرح كيفية تنظيم مستودع واحد مع PHP، وما هي الأدوات التي يجب استخدامها، وما هي المخاطر التي يجب مراعاتها.



ما هو المستودع الواحد ولماذا هو ضروري لمشاريع PHP؟



المستودع الواحد هو مخزن كود واحد يحتوي على عدة مشاريع أو حزم. في عالم PHP، المثال الكلاسيكي هو Laravel، الذي يتضمن الإطار (framework) وحزم المصادقة وقوائم الانتظار والبريد ومكونات أخرى في مستودع واحد.



المزايا الرئيسية لمشاريع PHP:

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


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



هيكل المستودع الواحد في PHP



الهيكل الصحيح هو أساس المستودع الواحد الناجح. دعنا نلقي نظرة على تنظيم نموذجي باستخدام مثال مشروع يحتوي على نواة (core) وعدة وحدات واختبارات.



my-php-monorepo/├── packages/│   ├── core/│   │   ├── src/│   │   │   └── CoreService.php│   │   ├── tests/│   │   └── composer.json│   ├── module-auth/│   │   ├── src/│   │   ├── tests/│   │   └── composer.json│   └── module-payment/│       ├── src/│       ├── tests/│       └── composer.json├── apps/│   ├── api/│   │   ├── public/│   │   ├── src/│   │   └── composer.json│   └── console/│       ├── src/│       └── composer.json├── tests/│   └── IntegrationTest.php├── composer.json (جذر)├── phpunit.xml.dist├── .gitignore└── README.md


المبادئ الأساسية للتنظيم:

  • التقسيم إلى حزم (packages) — كل حزمة لها ملف composer.json خاص بها مع الاسم والتحميل التلقائي والتبعيات.
  • التطبيقات (apps) — نقاط الدخول (API، أوامر وحدة التحكم) التي تجمع الحزم معًا.
  • ملف composer.json الجذر — يحتوي على تهيئة كلية للعمل مع المستودع الواحد.


إعداد ملف composer.json الجذر



لكي يعمل المستودع الواحد، من الضروري إعداد ملف composer.json الجذر بحيث تكون الحزم متاحة محليًا، دون نشرها على Packagist.



{    "name": "my-company/my-monorepo",    "type": "project",    "require": {        "php": "^8.1",        "my-company/core": "*",        "my-company/module-auth": "*",        "my-company/module-payment": "*"    },    "autoload": {        "psr-4": {            "MyCompany\\\\": "packages/"        }    },    "repositories": [        {            "type": "path",            "url": "packages/*",            "options": {                "symlink": true            }        }    ],    "scripts": {        "
```                

المدونات

توصيات الكتب