چرا در Laravel به Service Layer و Repository نیاز داریم؟

جداسازی منطق کسب‌وکار از Controller باعث تست‌پذیری، خوانایی و مقیاس‌پذیری پروژه‌های Laravel می‌شود — با مثال‌های عملی از پروژه واقعی.

چرا در Laravel به Service Layer و Repository نیاز داریم؟

وقتی پروژه Laravel از چند صفحه Livewire، پنل ادمین، بلاگ و API تشکیل شده باشد، قرار دادن query و business logic داخل Controller یا Component خیلی زود بدهی فنی (Technical Debt) می‌سازد. راه‌حل استاندارد در پروژه‌های حرفه‌ای: Service Layer + Repository Pattern.

Service Layer چه کاری انجام می‌دهد؟

Service پاسخ «چه اتفاقی باید بیفتد» را می‌دهد — نه «چطور از دیتابیس بخوانیم». مثال‌های واقعی:

  • ثبت مقاله بلاگ: slug یکتا، تنظیم published_at، invalidate کش
  • تأیید دیدگاه: بررسی وضعیت، ارسال notification (در صورت نیاز)
  • toggle فعال/غیرفعال: transaction + refresh cache

Controller یا Livewire فقط validate اولیه، فراخوانی Service و flash message را انجام می‌دهد.

Repository Pattern

Repository فقط مسئول ارتباط با persistence layer است. interface آن در Service inject می‌شود:

  • تست unit سرویس بدون دیتابیس واقعی
  • تمرکز queryهای پیچیده در یک کلاس
  • جلوگیری از تکرار where('is_active', true) در ده فایل مختلف

چک‌لیست Laravel 12

در پروژه فعلی portfolio از این موارد استفاده شده است:

  • Enum برای وضعیت‌ها (PostStatus, UserRole)
  • Constructor property promotion و type hint کامل
  • DB::transaction برای عملیات چندمرحله‌ای
  • loadMissing() برای جلوگیری از N+1 در صفحات بلاگ
  • Form validation در Livewire + ruleهای business در Service

اشتباه رایج

ساختن Service برای هر خط کد یا Repository با logic تجاری — هر دو anti-pattern هستند. Service باید orchestrator باشد؛ Repository فقط data access.

جمع‌بندی: اگر ۶ ماه بعد بخواهید فیچر جدید (مثلاً multi-vendor) اضافه کنید، لایه Service/Repository هزینه تغییر را به‌شدت کم می‌کند.

نظرات

دیدگاه‌ها

هنوز دیدگاهی ثبت نشده است.

ثبت دیدگاه

دیدگاه شما پس از تأیید نمایش داده می‌شود.