یکی از چیزهایی که پروژههای لاراول بزرگ را قابلنگهداریتر میکند، جدا کردن منطق دسترسی به دیتابیس از باقی لایههاست. اینجاست که Repository Pattern خیلی کمک میکند.
ایده ساده است: بهجای اینکه کنترلر مستقیم با
Model و کوئریها درگیر شود، با یک اینترفیس صحبت میکند. پشت این اینترفیس هر وقت خواستیم میتوانیم Eloquent را عوض کنیم، کش اضافه کنیم یا منبع داده را تغییر بدهیم، بدون اینکه کنترلر بشکند. 🔧۱) تعریف Interface برای Repository
<?php
namespace App\Repositories;
interface UserRepositoryInterface
{
public function paginate(int $perPage = 15);
public function findById(int $id);
public function create(array $data);
}
۲) پیادهسازی با Eloquent
<?php
namespace App\Repositories;
use App\Models\User;
class EloquentUserRepository implements UserRepositoryInterface
{
public function paginate(int $perPage = 15)
{
return User::query()->latest()->paginate($perPage);
}
public function findById(int $id)
{
return User::query()->findOrFail($id);
}
public function create(array $data)
{
return User::query()->create($data);
}
}
۳) Bind کردن در Service Container لاراول
این کار را معمولاً در
AppServiceProvider انجام میدهیم:<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Repositories\UserRepositoryInterface;
use App\Repositories\EloquentUserRepository;
class AppServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->bind(UserRepositoryInterface::class, EloquentUserRepository::class);
}
}
حالا هرجا
UserRepositoryInterface را type-hint کنیم، بهطور خودکار EloquentUserRepository تزریق میشود. این همان قدرت Dependency Injection در لاراول است. ⚡️۴) استفاده در Controller تمیزتر
<?php
namespace App\Http\Controllers;
use App\Repositories\UserRepositoryInterface;
use App\Http\Requests\StoreUserRequest;
class UserController extends Controller
{
public function __construct(
private readonly UserRepositoryInterface $users
) {}
public function index()
{
$users = $this->users->paginate(20);
return view('users.index', compact('users'));
}
public function store(StoreUserRequest $request)
{
$this->users->create($request->validated());
return redirect()->route('users.index');
}
}
حالا کنترلر فقط روی flow و پاسخ تمرکز دارد، نه روی جزئیات کوئریها. این کار:
• تستنویسی را سادهتر میکند (میتوان Mock از Repository ساخت) ✅
• وابستگی به Eloquent را از سطح کنترلر کم میکند ✅
• تغییرات دیتابیس یا اضافهکردن لایه cache را راحتتر میکند ✅
برای مطالعه عمیقتر، مستندات Service Container لاراول را ببینید:
https://laravel.com/docs/container
کمکم که پروژه بزرگتر میشود، استفاده درست از Repository Pattern میتواند ساختار کد را منظمتر، testableتر و قابلگسترشتر کند. از قدمهای کوچک شروع شود؛ مثلاً از ماژول User یا Order و بعد سایر بخشها را به این الگو مهاجرت بدهید. 🚀
🔖 #Laravel #PHP #لاراول #Laravel #Repository_Pattern #Clean_Code #Service_Container #PHP #Architecture
👤 Developix
💎 Channel: @DevelopixLaravel