✍️ مقاله آموزشی
•
زمان مطالعه: 8 دقیقه
ساختار پروژه متناسب با اصول SOLID در لاراول
انتشار: 2026/09/21
•
نویسنده: آکادمی آئینی
فریمورک لاراول به صورت پیشفرض با ساختاری بسیار ساده و انعطافپذیر ارائه میشود که برای پروژههای کوچک و متوسط عالی است. اما با بزرگ شدن پروژه و پیچیده شدن منطق کسبوکارهای مدرن، نگه داشتن تمام منطق در فایلهای کنترلر (Controllers) یا مدلهای الکوئنت (Eloquent Models)، منجر به ایجاد کدهای درهمتنیده، آشفته و غیرقابل تست میشود. رعایت اصول پنجگانه SOLID در ساختار پوشهبندی لاراول، پروژهتان را به کدهایی مقیاسپذیر، خوانا و تفکیکشده تبدیل میکند.
در این مقاله جامع از آکادمی آئینی، چگونگی پیادهسازی عملی اصول SOLID در ساختار پوشهبندی و معماری پروژههای لاراولی را به تفصیل بررسی میکنیم.
---
۱. لایه DTOs (Data Transfer Objects) و اعتبارسنجی (Form Requests)
برای رعایت اصل مسئولیت واحد (Single Responsibility) و جلوگیری از تزریق مستقیم دادههای آلوده ورودی به لایههای عمقی برنامه:
تفکیک اعتبارسنجی (App/Http/Requests): کنترلر نباید مسئول بررسی معتبر بودن قوانین ورودی باشد. قوانین اعتبارسنجی را کلاً به Form Requestها منتقل کنید.
استفاده از DTO (App/DTOs): دادههای خامی که از Request میآیند را به شیءهای ساختاریافته (Data Transfer Objects) تبدیل کنید تا نوع دادهها (Type Safety) مشخص بوده و تغییرات لایه HTTP تأثیری روی منطق اصلی برنامه نگذارد.
---
۲. لایه اکشنها یا سرویسها (App/Actions یا App/Services)
کنترلرها تنها مسئول دریافت درخواست HTTP و بازگرداندن پاسخ (Response) هستند و نباید هیچگونه منطق تجاری (Business Logic) در آنها نوشته شود:
معماری Single-Action Classes (App/Actions): برای هر فرآیند خاص در سیستم (مانند ثبتنام کاربر، پردازش سفارش یا ارسال فاکتور) یک کلاس مجزا با تنها یک متد عمومی مانند execute یا handle بسازید. این کار دقیقاً پیادهسازی اصل SRP در سطح کلاسهاست.
قابلیت تستپذیری سریع: با ایزولهسازی منطق در Actionها، میتوانید بدون درگیری با لایه HTTP، برای هر فرایند تستهای واحد (Unit Tests) بنویسید.
---
۳. لایه ریپازیتوری و اینترفیسها (App/Repositories & App/Contracts)
ارتباط مستقیم کلاسهای منطقی با مدلهای الکوئنت (Eloquent) باعث وابسته شدن پروژه به یک دیتابیس یا ORM خاص میشود که ناقض اصل وارونگی وابستگی (Dependency Inversion) است:
ساخت اینترفیسها (App/Contracts/Repositories): برای هر بخش دیتابیس یک Interface تعریف کنید (مانند UserRepositoryInterface) که فقط نام متدها را مشخص میکند.
پیادهسازی متدها (App/Repositories/Eloquent): کدهای واقعی کوئری زدن به دیتابیس را درون کلاسهای پیادهسازی (مانند UserRepository) قرار دهید.
اتصال در Service Provider: با استفاده از Service Provider لاراول، اینترفیس را به کلاس واقعی Bind کنید. اگر در آینده دیتابیس را به MongoDB یا یک API بیرونی تغییر دهید، فقط کافیست کلاس پیادهسازی جدید را متصل کنید بدون اینکه کدهای لایه بالاتر دست بخورند (اصل Open/Closed).
---
۴. لایه رویدادها و شنوندگان (App/Events & App/Listeners)
عملیاتهای فرعی پروژه نباید روند اجرای اصلی را کند یا پیچیده کنند:
جداسازی واکنشها: پس از خرید کاربر، عملیاتهایی مثل ارسال پیامک، صدور فاکتور و کاهش موجودی نباید کدهای متوالی در یک کلاس باشند.
انتشار رویداد (Event-Driven): یک رویداد مانند OrderProcessed شلیک کنید و کارهای فرعی را به Listenerهای جداگانه بسپارید. این کار باعث میشود افزودن یک واکنش جدید (مثلاً ارسال پیام به تلگرام) بدون دستکاری کدهای قبلی انجام شود.
---
۵. ساختار کامل پوشهبندی پیشنهادی در App
یک ساختار تمیز و استاندارد مطابق اصول SOLID در لاراول به شکل زیر خواهد بود:
App/Contracts/ (حاوی تمام اینترفیسها و قراردادها)
App/DTOs/ (حاوی کلاسهای انتقال داده خنثی)
App/Actions/ (کلاسهای تکمنظوره منطق تجاری)
App/Repositories/ (کلاسهای ارتباط با دیتابیس)
App/Services/ (سرویسهای تعامل با APIهای بیرونی)
---
جمعبندی
ساختاردهی به پروژه لاراول بر اساس اصول SOLID در ابتدای کار ممکن است نیازمند ساخت فایلهای بیشتری باشد، اما با رشد پروژه، ارزش واقعی خود را نشان میدهد. این معماری هزینه عیبیابی را کاهش میدهد، افزودن ویژگیهای جدید را بدون خراب کردن بخشهای قبلی ممکن میسازد و کار گروهی بین توسعهدهندگان را فوقالعاده روان و لذتبخش میکند.