اصول 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
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: معماری.