Sitemap

Laravel ile Domain Driven Design (DDD) Uygulamaları

3 min readFeb 23, 2024

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.

--

--

Responses (1)