Skip to content

Muhammed2024Salama/laravel-repository-service-pattern

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

🧠 ليه نستخدم (Interface - Repository - Service) في Laravel؟

✅ الهدف:

نفصل المسؤوليات (Separation of Concerns) وده مهم جدًا في المشاريع المتوسطة والكبيرة.

  • Controller: يستقبل الطلب ويتعامل مع الرد (Response).
  • Service: يحتوي على منطق العمل (Business Logic).
  • Repository: يتعامل مع قاعدة البيانات مباشرة.
  • Interface: يحدد التعاقد بين الـ Repository وباقي المشروع، وبيسهّل التبديل أو الاختبار.

🧱 الخطوة 1: إنشاء الـ Product Model مع Migration

php artisan make:model Product -m

شرح:
-m تعني إنشاء ملف Migration تلقائي مع الموديل.

✏️ في ملف Migration:

Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->decimal('price', 10, 2); // السعر بفاصلة عشرية
    $table->timestamps();
});

ثم نشغّل الأمر:

php artisan migrate

🧱 الخطوة 2: إنشاء الـ Interface

mkdir app/Repositories
touch app/Repositories/ProductRepositoryInterface.php
<?php

namespace App\Repositories;

interface ProductRepositoryInterface
{
    public function getAll();
    public function getById($id);
    public function create(array $data);
    public function update($id, array $data);
    public function delete($id);
}

🧱 الخطوة 3: إنشاء الـ Repository

touch app/Repositories/ProductRepository.php
<?php

namespace App\Repositories;

use App\Models\Product;

class ProductRepository implements ProductRepositoryInterface
{
    public function getAll()
    {
        return Product::all();
    }

    public function getById($id)
    {
        return Product::findOrFail($id);
    }

    public function create(array $data)
    {
        return Product::create($data);
    }

    public function update($id, array $data)
    {
        $product = Product::findOrFail($id);
        $product->update($data);
        return $product;
    }

    public function delete($id)
    {
        return Product::destroy($id);
    }
}

⚙️ الخطوة 4: ربط الـ Interface بالـ Repository في AppServiceProvider

افتح app/Providers/AppServiceProvider.php وأضف:

use App\Repositories\ProductRepositoryInterface;
use App\Repositories\ProductRepository;

public function register()
{
    $this->app->bind(ProductRepositoryInterface::class, ProductRepository::class);
}

🧠 الخطوة 5: إنشاء الـ Service

mkdir app/Services
touch app/Services/ProductService.php
<?php

namespace App\Services;

use App\Repositories\ProductRepositoryInterface;

class ProductService
{
    protected $productRepository;

    public function __construct(ProductRepositoryInterface $productRepository)
    {
        $this->productRepository = $productRepository;
    }

    public function getAll()
    {
        return $this->productRepository->getAll();
    }

    public function getById($id)
    {
        return $this->productRepository->getById($id);
    }

    public function create(array $data)
    {
        return $this->productRepository->create($data);
    }

    public function update($id, array $data)
    {
        return $this->productRepository->update($id, $data);
    }

    public function delete($id)
    {
        return $this->productRepository->delete($id);
    }
}

🎮 الخطوة 6: إنشاء الـ Controller

php artisan make:controller ProductController
<?php

namespace App\Http\Controllers;

use App\Services\ProductService;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    protected $productService;

    public function __construct(ProductService $productService)
    {
        $this->productService = $productService;
    }

    public function index()
    {
        return response()->json($this->productService->getAll());
    }

    public function store(Request $request)
    {
        return response()->json($this->productService->create($request->all()));
    }

    public function show($id)
    {
        return response()->json($this->productService->getById($id));
    }

    public function update(Request $request, $id)
    {
        return response()->json($this->productService->update($id, $request->all()));
    }

    public function destroy($id)
    {
        $this->productService->delete($id);
        return response()->json(['message' => 'Deleted']);
    }
}

🛣️ الخطوة 7: إعداد الـ Routes

في routes/api.php:

use App\Http\Controllers\ProductController;

Route::resource('products', ProductController::class);

📌 الترتيب النهائي:

  1. Interface: تعريف قواعد التعامل.
  2. Repository: تنفيذ العمليات مع قاعدة البيانات.
  3. Service: يحتوي منطق العمل.
  4. Controller: يستقبل الطلب ويرد بالنتيجة.
  5. Route: يوصل بين الـ Endpoint و الـ Controller.

👨‍💻 Author

Muhammed Salama
devmuhammedsalama@gmail.com

About

Clean Architecture in Laravel using Product CRUD – Interface, Repository, Service pattern explained step by step.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy