نفصل المسؤوليات (Separation of Concerns) وده مهم جدًا في المشاريع المتوسطة والكبيرة.
- Controller: يستقبل الطلب ويتعامل مع الرد (Response).
- Service: يحتوي على منطق العمل (Business Logic).
- Repository: يتعامل مع قاعدة البيانات مباشرة.
- Interface: يحدد التعاقد بين الـ Repository وباقي المشروع، وبيسهّل التبديل أو الاختبار.
php artisan make:model Product -m
شرح:
-m
تعني إنشاء ملف Migration تلقائي مع الموديل.
Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->decimal('price', 10, 2); // السعر بفاصلة عشرية $table->timestamps(); });
ثم نشغّل الأمر:
php artisan migrate
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); }
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); } }
افتح app/Providers/AppServiceProvider.php
وأضف:
use App\Repositories\ProductRepositoryInterface; use App\Repositories\ProductRepository; public function register() { $this->app->bind(ProductRepositoryInterface::class, ProductRepository::class); }
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); } }
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']); } }
في routes/api.php
:
use App\Http\Controllers\ProductController; Route::resource('products', ProductController::class);
- Interface: تعريف قواعد التعامل.
- Repository: تنفيذ العمليات مع قاعدة البيانات.
- Service: يحتوي منطق العمل.
- Controller: يستقبل الطلب ويرد بالنتيجة.
- Route: يوصل بين الـ Endpoint و الـ Controller.
Muhammed Salama
devmuhammedsalama@gmail.com