TGViewer
| کانال توسعه‌دهندگان لاراول | | کانال توسعه‌دهندگان لاراول | @developixlaravel · 1.54K subscribers
Post #185 765
‏Repository Pattern در پروژه‌های لاراول 🧱

یکی از چیزهایی که پروژه‌های لاراول بزرگ را قابل‌نگهداری‌تر می‌کند، جدا کردن منطق دسترسی به دیتابیس از باقی لایه‌هاست. این‌جاست که 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
  • ❤ 8
  • 👍 3
  • 👎 1
More from @developixlaravel
  1. Oct 1, 2026روابط پایگاه داده چند ریختی یا Eloquent Polymorphic در لاراول - قسمت اول در لاراول، روابط…
  2. Sep 30, 2026مدیریت همزمانی و قفل‌گذاری روی پردازش‌ها در لاراول (Laravel Atomic Locks) در بخش چهارم از…
  3. Sep 26, 2026🔥 پکیج: ورود با حساب‌های دیگر؛ Socialite برای اضافه‌کردن ورود با حساب‌های دیگر به پروژه ل…
  4. Sep 25, 2026🔒 فقط داده‌های تأییدشده را ذخیره کن وقتی یک فرم ویرایش پروفایل داری، ممکن است کلاینت علاو…
  5. Sep 20, 2026حفاظت از پردازش ها با Laravel Rate Limiter بخش سوم - پیکربندی در قسمت سوم از مجموعه آموزش…
  6. Sep 16, 2026🚀 &rlm;LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →