DDD архитектура

Обсуждаем, как правильно строить приложения
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DDD архитектура

Сообщение ElisDN »

sda писал(а):Спасибо, Дмитрий. Вы можете привести пример коллекции, как она должна выглядеть?
Примитивно:

Код: Выделить всё

class CustomerView
{
    /**
     * @var Customer
     */
    public $customer;
    /**
     * @var Order[]
     */
    public $orders;

    public function __construct(Customer $customer, array $orders)
    {
        $this->customer = $customer;
        $this->orders = $orders;
    }
} 
Либо с приватными полями и с геттерами.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Спасибо, но я хотел пример коллекции, которая возвращается например из метода findAll в репозитории. Что-то такое http://www.slideshare.net/SteveRhoades2 ... -in-php#32

Мне здесь непонятно, почему каждый мой класс коллекции должен реализовывать интерфейс Iterator? Это же ведет к дублированию кода. Может быть разумнее создать класс Collection implements Iterator, а затем UserCollection extends Collection ? Или как это делать.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Может быть это вообще лишнее усложнение и проще из findAll возвращать сразу массив сущностей. Как-то так

Код: Выделить всё

class UserRepository implements UserRepositoryInterface {
  ...
  public function findAll($limit = 10) {
    $rows = $this->db->query('SELECT * FROM users LIMIT :limit', ['limit' => $limit]);
    $users = [];
    
    foreach ($rows as $row) {
      $users[] = new User($row['email'], $row['password']);
    }
    return $users;
  }
}
Хотелось бы разобраться.
Последний раз редактировалось sda 2016.09.17, 21:20, всего редактировалось 1 раз.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DDD архитектура

Сообщение ElisDN »

Ну да. Возвращайте из findAll просто массив.

Коллекция на слайде сделана для ленивой прогрузки объектов. Iterator нужен для обхода её в foreach.

Внутри агрегатов удобно использовать ArrayCollection из Doctrine, так как в ней есть filter, has и подобные методы.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

А вот есть еще сущности у которых много полей. Для решения предлагают builder pattern вот здесь http://stackoverflow.com/a/40324/2868530

Но как быть, мне не хочется писать в каждом методе репозитория примерно такое

Код: Выделить всё

class UserRepository implements UserRepositoryInterface {
  public function findById($id) {
    ...
    return userBuilder
      ->user()
      ->withEmail($row['email'])
      ->withPassword($row['password'])
      ...
      ->with100500Field($row['100500field'])
      ->build();
  }
  public function findAll() {
    ...
    foreach($rows as $row) {
      $users[] = userBuilder
          ->user()
          ->withEmail($row['email'])
          ->withPassword($row['password'])
          ...
          ->with100500Field($row['100500field'])
          ->build();
    }
  }
}
 
Получается копи-паст. Также когда у сущности добавится новое свойство, придется во всех методах репозитория его добавлять. Какое может быть решение?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Я думал может нужен гидратор примерно как здесь http://www.slideshare.net/SteveRhoades2 ... -in-php#29 Но ничего не понял. Сущность обычно создают сразу передавая ей в конструктор нужные значения, а здесь получается это делают через сеттеры внутри метода гидратора. В книге ддд квикли писали, что в сущности вообще сеттеров быть не должно. Ну и я погуглил такого паттерна как гидратор не существует, это выдумка зенд фреймворка. И даже если его создать, то непонятно к какому слою он должен относиться, это и не инфраструктура и не домен тоже. Поэтому опять впал в ступор :(
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DDD архитектура

Сообщение ElisDN »

sda писал(а):Я думал может нужен гидратор примерно как здесь... Но ничего не понял. Сущность обычно создают сразу передавая ей в конструктор нужные значения
Переделайте под заполнение через конструктор:

Код: Выделить всё

class UserRepository implements UserRepositoryInterface {
    public function findById($id) {
        ...
        return $this->hydrate($row);
    }
    public function findAll() {
         ...
        foreach($rows as $row) {
            $users[] = $this->hydrate($row);
        }
    }
    private function hydrate($row) {
        return new User($row['username'], ...);
    }
    ...
}
Если User нужно будет и в других репозиториях заполнять, то вынесите метод hydrate в класс UserHydrator и вызывайте:
$this->userHydrator->hydrate($row);
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Получается, что если добавится новое свойство у сущности в будущем, то придется сущность вместе с её репозиторием немного изменить, ничего не поделать?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

а в каком слое хранить UserHydrator ?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DDD архитектура

Сообщение ElisDN »

sda писал(а):а в каком слое хранить UserHydrator ?
В папке с классом репозитория, так как он больше никому не нужен.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

А как быть, если я хочу выбрать данные из базы по 3+ входным параметрам? У метода репозитория становится слишком много аргументов.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DDD архитектура

Сообщение ElisDN »

sda писал(а):А как быть, если я хочу выбрать данные из базы по 3+ входным параметрам? У метода репозитория становится слишком много аргументов.
По каким, например?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Страна, город, статус. Или реализация поиска с кучей фильтров, непонятно как делать.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DDD архитектура

Сообщение ElisDN »

sda писал(а):Страна, город, статус. Или реализация поиска с кучей фильтров, непонятно как делать.
Объединяйте в структуры, спецификации и т.п.:

Код: Выделить всё

findAllByAddress(Address $address)
findAllByCriteria(Criteria $criteria, Pagination $pagination) 
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Я читал про specification pattern, но он вроде не о об этом. Где вообще можно нагуглить примеры/статьи как правильно делать? Ничего не получается найти.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: DDD архитектура

Сообщение ElisDN »

sda писал(а):Я читал про specification pattern, но он вроде не о об этом.
Сделайте просто класс PostSearch с полями $title, $categoryId и прочими для конкретного поиска и передавайте его:

Код: Выделить всё

findAllBySearch($search, ...) 
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: DDD архитектура

Сообщение rugabarbo »

Я использую при сложных составных аргументах OptionsResolver из Symfony: http://symfony.com/doc/current/componen ... olver.html

Он позволяет эмулировать именованные параметры (которых, к сожалению, нет в PHP) со всяческими дефлотами, нормализациями, валидацией и т.п.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Спасибо парни, я просто хочу, чтобы не совсем говно было. Но что-то пока не получается. Код как после ядерной войны, в ходе этих экспериментов.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: DDD архитектура

Сообщение rugabarbo »

А что делаете? Если не секрет (: Где DDD понадобилось? Для самообразования или для дела?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Сайт развлекательного характера. Много бизнес-логики. Ничего не получается из-за всего этого хайпа, что сейчас творится в вебе. Особенно во фронтенде. В бекенде ddd где по книжкам все красиво, но когда доходишь до деталей, то ответы в сети найти не получается. С базами непонятно. Одни толком не масштабируются, у других проблемы с транзакциями.
Закрыто