نفصل المسؤوليات (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