Laravel ile Domain Driven Design (DDD) Uygulamaları
Domain Driven Design (DDD — Alan Odaklı Tasarım), Eric Evans tarafından geliştirilen ve yazılımın, iş süreçlerinin ve sistem gereksinimlerinin anlaşılmasına odaklanan bir yazılım geliştirme yaklaşımıdır. DDD’nin temel amacı, yazılımı işin gerektirdiği şekilde modellemek ve bu sayede daha etkili ve anlaşılır sistemler oluşturmaktır. DDD, özellikle büyük ve karmaşık sistemler için uygundur. Bu makale, Laravel çerçevesinde DDD’nin nasıl uygulanabileceğini detaylı bir şekilde ele alacaktır. Laravel, PHP tabanlı popüler bir web uygulama framework’üdür ve MVC (Model-View-Controller — Model-Görünüm-Kontrolcü) mimari desenini benimser. DDD’nin Laravel ile entegrasyonu, kodun daha anlaşılır ve iş süreçlerine daha uygun hale gelmesini sağlar.
DDD’nin Temel Kavramları
Domain Model (Alan Modeli)
Domain Model, iş süreçlerini ve kurallarını yansıtan bir yazılım modelidir. Laravel’de bu, Entity’ler (Varlıklar) ve Value Objects (Değer Nesneleri) aracılığıyla gerçekleştirilir. Eloquent ORM, Laravel’in bu modelleme işlemleri için sunduğu bir araçtır.
Ubiquitous Language (Her Yerde Geçen Dil)
Ubiquitous Language, proje ekibi arasında kullanılan ortak bir dildir. Laravel projelerinde, bu, kod, veritabanı şemaları ve iş akışları arasında tutarlı bir terminoloji kullanımını içerir.
Bounded Context (Sınırlı Bağlam)
Bounded Context, modelin sınırlarını belirleyen bir çerçevedir. Laravel’de, farklı Bounded Context’ler farklı namespace’ler (isim alanları) veya hatta farklı Laravel paketleri olarak düzenlenebilir.
Entities ve Value Objects
Entities, kimlikleriyle tanımlanan nesnelerdir. Laravel’de bunlar genellikle Eloquent modelleri olarak karşımıza çıkar. Value Objects ise değerlerine göre tanımlanan ve kimliği olmayan nesnelerdir.
Aggregates (Topluluklar)
Aggregate, bir Entity ve onunla ilişkili nesnelerin bir bütünüdür. Laravel’de, bir Aggregate root (kök), ilişkili modellerle birlikte bir bütün olarak yönetilir.
Repositories (Depolar)
Repositories, Entities’e erişim için kullanılan sınıflardır. Laravel’de genellikle Eloquent model sınıfları aracılığıyla yapılır.
Domain Services (Alan Servisleri)
Domain Services, iş mantığını barındıran servislerdir. Laravel’de, bu servisler genellikle “Service” sınıfları olarak uygulanır.
Domain Events (Alan Olayları)
Domain Events, önemli iş olaylarını temsil eder. Laravel, olayları (events) ve dinleyicileri (listeners) ile bu kavramı destekler.
Laravel ile DDD Uygulama Örnekleri
Basit Uygulama: Ürün Yönetimi
Bu bölümde, bir Product
(Ürün) modeli, bir repository ve basit bir servis sınıfı oluşturacağız.
1. Product Entity (Varlık) Oluşturma
Laravel Eloquent modeli olarak Product
sınıfı:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = ['name', 'price'];
}
2. Product Repository Oluşturma
Repository pattern uygulayarak Product
nesneleri için bir repository sınıfı oluşturun:
namespace App\Repositories;
use App\Models\Product;
class ProductRepository
{
public function find($id)
{
return Product::find($id);
}
// Diğer gerekli metotlar...
}
3. ProductService Oluşturma
Ürün işlemlerini yönetmek için bir servis sınıfı:
namespace App\Services;
use App\Repositories\ProductRepository;
class ProductService
{
protected $repository;
public function __construct(ProductRepository $repository)
{
$this->repository = $repository;
}
public function getProduct($id)
{
return $this->repository->find($id);
}
// Diğer iş mantığı metotları...
}
Orta Seviye Uygulama: Sipariş İşleme
Bu örnekte, Order
ve OrderLine
entity'leri ile ilgili bir Aggregate yapısını ve işleme servisini inceleyeceğiz.
1. Order ve OrderLine Entity’leri Oluşturma
Order
ve OrderLine
modelleri:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Order extends Model
{
public function orderLines()
{
return $this->hasMany(OrderLine::class);
}
// Diğer özellikler ve metotlar...
}
class OrderLine extends Model
{
// Özellikler ve metotlar...
}
2. OrderService Oluşturma
Sipariş işlemlerini yöneten bir servis:
namespace App\Services;
use App\Models\Order;
use App\Models\OrderLine;
class OrderService
{
public function createOrder($customerData, $orderData)
{
$order = new Order($customerData);
foreach ($orderData as $line) {
$order->orderLines()->save(new OrderLine($line));
}
$order->save();
return $order;
}
// Diğer iş mantığı metotları...
}
Karmaşık Uygulama: Çoklu Bounded Context
Bu bölümde, farklı Bounded Context’ler arasındaki etkileşimi ele alacağız. Örneğin, Customer
ve Inventory
gibi farklı context'lerin nasıl birlikte çalıştığını gösteren bir yapı kuracağız.
1. Customer ve Inventory Modelleri Oluşturma
Customer
ve Inventory
Eloquent modelleri:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Customer extends Model
{
// Özellikler ve metotlar...
}
class Inventory extends Model
{
// Özellikler ve metotlar...
}
2. İlgili Servisler Oluşturma
Her bir Bounded Context için servis sınıfları:
namespace App\Services;
use App\Models\Customer;
// Diğer gerekli modeller...
class CustomerService
{
public function createCustomer($data)
{
$customer = new Customer($data);
$customer->save();
return $customer;
}
// Diğer iş mantığı metotları...
}
class InventoryService
{
// Benzer şekilde Inventory ile ilgili işlemler...
}
Sonuç
Laravel ile Domain Driven Design uygulamak, PHP tabanlı projelerde daha anlaşılır, sürdürülebilir ve iş odaklı bir mimari oluşturmayı mümkün kılar. DDD’nin prensiplerini Laravel projelerine entegre etmek, karmaşık iş süreçlerini yönetmede büyük avantajlar sağlar. Bu makale, Laravel’de DDD’nin temel kavramlarını ve uygulama yöntemlerini sunmaktadır, ancak her projenin kendine özgü ihtiyaçları olduğunu ve bu yüzden bu yaklaşımların projeye özgü olarak uyarlanması gerektiğini unutmamak önemlidir.