DDD in PHP on example of Symfony
Олег Зинченко
В докладе речь пойдет о том, что такое DDD и почему MVC годами вводит нас в заблуждение. Как автор пришёл к мысли о том, что просто писать структурированный код недостаточно. Будут описаны слои приложения DDD, как они взаимодействуют между собой. Какие архитектурные паттерны стоят за DDD и почему они облегчают жизнь разработчика. Когда лучше использовать DDD, какие достоинства и недостатки есть у этого подхода. Примеры использованиея DDD подхода в Symfony приложениях.
15. Anemic (Domain) Model
“In essence the problem with anemic domain
models is that they incur all of the costs of a domain
model, without yielding any of the benefits.”
Martin Fowler
http://www.martinfowler.com/bliki/AnemicDomainModel.html
http://habrahabr.ru/post/224879/
21. What is
Inversion of control
Service Locator
Dependency Injection Container
http://www.martinfowler.com/articles/injection.html
http://fabien.potencier.org/article/11/what-is-dependency-injection
40. Domain Model
<?php
namespace MegaCorpCoreProduct;
class Product
{
private $id;
private $name;
private $recognitionStrategy;
public function __construct(
ProductId $id, $name, $recognitionStrategy
) {
$this->id = $id;
$this->name = $name;
$this->recognitionStrategy = $recognitionStrategy;
}
41. Repository
<?php
namespace MegaCorpCoreProduct;
interface ProductRepository
{
public function find(ProductId $productId);
public function findAll();
public function add(Product $product);
public function remove(Product $product);
}
42. Value Object
<?php
namespace MegaCorpCore;
class ProductId
{
private $value;
public function __construct($value)
{
$this->value = (string) $value;
}
public function getValue()
{
return $this->value;
}
}
44. Value Object DateRange
<?php
public function findByDateRange(
DateTime $from, DateTime $to )
class DateRange
{
private $from;
private $to;
public function __construct(DateTime $from, DateTime $to)
{
$this->from = $from;
$this->to = $to;
}
}
public function findByDateRange(DateRange $range)