Modularity
مقدمه
در توسعه نرمافزار، مخصوصاً در پروژههای بزرگ و پیچیده، موارد زیر اهمیت زیادی دارند:
- نگهداری آسان (Maintainability)
- سازماندهی شفاف کد (Clear Code Organization)
- قابلیت استفاده مجدد (Reusability)
زیرساخت Doravel با الهام از این اصول، معماری خود را بر پایهی پکیج قدرتمند nwidart/laravel-modules نسخه ۱۲ بنا کرده است.
این رویکرد باعث میشود پروژه شما به جای یک ساختار یکپارچه (Monolith)، به مجموعهای از ماژولهای مستقل تقسیم شود. هر ماژول مسئول یک قابلیت خاص است و میتواند جداگانه توسعه، تست و نگهداری شود.
مزایای معماری ماژولار
- افزودن سریعتر قابلیتهای جدید
- اعمال تغییرات با کمترین تأثیر روی بخشهای دیگر
- کاهش پیچیدگی و سادهتر شدن دیباگینگ
- مقیاسپذیری و پایداری بیشتر در بلندمدت
معماری ماژولار
Doravel با بهرهگیری از قابلیتهای laravel-modules نسخه ۱۲، معماری خود را بر اساس Domain-Driven Design (DDD) طراحی کرده است.
به جای تقسیمبندی کد بر اساس نوع فایل (مانند Controllers یا Models در پوشههای مرکزی)، ساختار پروژه بر اساس قابلیتها (Features) یا دامنهها (Domains) سازماندهی میشود.
ساختار داخلی ماژول (نسخه ۱۲)
وقتی دستور ساخت ماژول را اجرا میکنید، ساختار زیر ایجاد میشود:
Modules/
└── Bank/
├── app/ # PHP کدهای اصلی
│ ├── Http/
│ │ └── Controllers/
│ │ └── BankController.php
│ └── Providers/
│ ├── BankServiceProvider.php
│ ├── EventServiceProvider.php
│ └── RouteServiceProvider.php
│
├── composer.json # autoload تعریف وابستگیها و
├── config/
│ └── config.php # تنظیمات اختصاصی ماژول
│
├── database/
│ ├── factories/ # Model Factories
│ ├── migrations/ # Migrations
│ └── seeders/
│ └── BankDatabaseSeeder.php
│
├── lang/ # فایلهای ترجمه
│ └── fa/
│
├── module.json # مانیفست ماژول
├── package.json # وابستگیهای فرانتاند
│
├── resources/
│ ├── assets/
│ │ ├── js/app.js
│ │ └── sass/app.scss
│ └── views/
│ ├── components/
│ │ └── layouts/master.blade.php
│ └── index.blade.php
│
├── routes/
│ ├── api.php
│ └── web.php
│
├── tests/
│ ├── Feature/
│ └── Unit/
│
└── vite.config.js # Vite تنظیمات
Service Provider ماژول
هر ماژول یک Service Provider اختصاصی دارد (مثلاً BankServiceProvider.php) که وظیفه دارد:
- ثبت مسیرها (
RouteServiceProvider) - بارگذاری Migrationها، Viewها و فایلهای ترجمه
- ادغام Config ماژول با Config اصلی
- ثبت سرویسها و Bindings در Container
شما باید متدهای غیرضروری را حذف یا کامنت کنید تا از بارگذاریهای اضافی جلوگیری شود.
فایل module.json
فایل module.json قلب هر ماژول است و اطلاعات مهمی مانند نام، alias، Service Providerها و وابستگیها را نگه میدارد:
{
"name": "Bank",
"alias": "bank",
"description": "Module for managing bank services.",
"keywords": [],
"priority": 1,
"providers": [
"Modules\\Bank\\Providers\\BankServiceProvider",
"Modules\\Bank\\Providers\\RouteServiceProvider"
],
"aliases": {},
"files": [],
"requires": []
}
مدیریت وضعیت ماژولها
فایل module_statuses.json در ریشه پروژه وضعیت فعال یا غیرفعال بودن ماژولها را نگه میدارد:
{
"Bank": true,
"User": true,
"Payment": false
}
دستورات Artisan برای مدیریت وضعیت
php artisan module:enable Bank
php artisan module:disable Bank
php artisan module:list
دستورات پرکاربرد Artisan در معماری ماژولار
پکیج laravel-modules مجموعهای از دستورات Artisan را برای توسعه سریعتر فراهم میکند:
php artisan module:make Blog
php artisan module:make-controller PostController Blog
php artisan module:make-model Post Blog
نتیجهگیری
با استفاده از معماری ماژولار :
- هر قابلیت در یک فضای مستقل توسعه داده میشود.
- کد خواناتر، تستپذیرتر و مقیاسپذیرتر خواهد بود.
- مدیریت تیمی پروژه سادهتر و کارآمدتر میشود.