پرش به مطلب اصلی

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

نتیجه‌گیری

با استفاده از معماری ماژولار :

  • هر قابلیت در یک فضای مستقل توسعه داده می‌شود.
  • کد خواناتر، تست‌پذیرتر و مقیاس‌پذیرتر خواهد بود.
  • مدیریت تیمی پروژه ساده‌تر و کارآمدتر می‌شود.