مقاله

SRP، OCP، LSP، ISP، DIP در پروژه Laravel واقعی — نه تعریف کتاب درسی، بلکه refactor عملی.

اصول SOLID در Laravel — راهنمای عملی با مثال کد

اصول SOLID در Laravel — راهنمای عملی با مثال کد

SOLID پنج اصل برای OOP است که در Laravel همان‌قدر معتبر است — شاید بیشتر، چون container DI شما را به DIP سوق می‌دهد. مشکل اینجاست که خیلی‌ها فقط حفظ می‌کنند. این مقاله هر اصل را با بوی Controller چرب و راه فرار Laravel می‌زند.

S — Single Responsibility

«یک دلیل برای تغییر». Controller فقط HTTP؛ PostService فقط منطق post؛ PostRepository فقط query.

// بد — همه چیز در Controller
public function store(Request $request) {
    // validate, save, mail, log, cache...
}

// خوب
public function store(StorePostRequest $request, PostService $service) {
    $post = $service->create($request->validated());
    return new PostResource($post);
}

اصول طلایی.

O — Open/Closed

باز برای گسترش، بسته برای تغییر. تخفیف جدید بدون دست زدن به OrderService:

interface DiscountStrategy { public function amount(Order $o): int; }
// کلاس جدید PercentOffBlackFriday implements DiscountStrategy

Strategy.

L — Liskov Substitution

subtype باید جای parent را بگیرد بدون شکستن. اگر FileStorage implements Storage، هر جا Storage انتظار می‌رود FileStorage کار کند — throw ناگهانی در یک متد = نقض LSP.

I — Interface Segregation

interface کوچک بهتر از fat interface. به‌جای GodRepository با ۲۰ متد، PostReader و PostWriter اگر واقعاً لازم است — در عمل Laravel اغلب یک repository per aggregate کافی است.

D — Dependency Inversion

وابستگی به abstraction نه concrete. Laravel:

public function __construct(
    private PostRepositoryInterface $posts,
    private MailerInterface $mailer,
) {}

binding در ServiceProvider — Repository.

SOLID و over-engineering

CRUD ساده ۵ interface نمی‌خواهد. وقتی درد تکرار و تست سخت شد SOLID اعمال کنید — اشتباهات.

چک‌لیست code review

  • Controller > ۱۵ خط action؟ SRP
  • switch روی type برای رفتار جدید؟ OCP
  • new ConcreteClass در Service؟ DIP

جمع‌بندی

SOLID راهنماست نه قانون. Action: Action classes. Layer: معماری.

refactor SOLID