Использовать специальный объект propose вместо массивов

это будет полностью теоретическая тема.

Давайте поговорим об изменении массивов специально для объекта, чтобы сравнить и работать с ним.

Например, у нас есть EntityClass, EntityInterface, SomeRepository, SomeManager, SomeCommand,

Entities — это чистый объект, пример:

class EntityClass implements EntityInterface {
public $name;

public funtion getName() {
return $this->name;
}

public function assign($data) {
$this->name = $data['name'];
}
...
}

Репозиторий ofc. есть метод, чтобы сохранить объект в источнике и получить его из источника.

Менеджер имеет всю «бизнес-логику», он может изменять сущности, используя шаблон команды, одну команду для одного свойства, поэтому бизнес-логика для всех свойств хранится в отдельной команде, а менеджер запускает ее.

Теперь в диспетчере начинаем всю логику и веселье.
Маленькая стенография:

  1. Репозиторий создает новую сущность с помощью getOne ().
  2. Мы создаем новый экземпляр менеджера и передаем конструктору некоторые зависимости, такие как массив данных из контроллера и Entity.
  3. Массив данных содержит информацию об изменениях, например: ['name' => 'New name']; mapper решает, какая команда должна быть запущена менеджером для данного массива.
  4. Диспетчер выполняет все команды для этого запроса и передает необработанный массив каждой команде.

Теперь, почему мы передаем массив? когда мы находимся в ООП, почему бы не использовать специальные варианты EntityClass ??

Теперь давайте добавим новый интерфейс EntityProposeInterfaceи измените необработанный массив на класс, реализующий этот интерфейс, и передайте их.

например, мы можем добавить к SomeManager метод speciall для преобразования сущности следующим образом (PHP7 +):

class SomeManager {
public function morph($entity) {
$buff = new class extends EntityClass implements EntityProphoseInterface{};
$buff->assign($entity->toArray());
return $buff;
}

И теперь у нас есть EntityProphose давайте внесем некоторые изменения, теперь менеджер изменит EntityProphose из массива необработанных данных, и все команды и другие методы в нашем коде работают над объектами. EntityProphose вместо массива.

Но оф. наш репозиторий не может сохранить объект instance of EntityProphoseInterface,

И это все…
Есть ли какое-то имя шаблона дизайна? или как то так?

Или эта идея очень плохая?

Надеюсь, вам всем ясно, если нет, спросите.
Есть идеи ? совет ?

1

Решение

Что сводит меня с ума, так это то, почему вы реализуете функцию назначать значения из массива во весь класс вместо обычных регулярных присваиваний:

$entity->name = name;
$entity->age = age;

Возможно, вы хотите упростить этот код … но какой смысл использовать массивы?

Ваш менеджер класс (на самом деле, услуга) должен предоставлять функциям либо параметры, соответствующие любому объекту, который вы хотите изменить или использовать, либо просто получать DTO или сам объект.

С другой стороны, если вы хотите централизовать, как DTO или сущности отображаются друг на друга, возможно, вам нужно реализовать сопоставители объектов:

class EntityMapper {
public function mapCustomerToCustomer($customerA, $customerB) {
if($customerA->name != null) {
$customerB->name = $customerA->name;
}
// and so on...
}
}

…и вы можете внедрить его, где вы хотите отобразить объекты. Например, CustomerService может выглядеть следующим образом:

class CustomerService {
function __construct($entityMapper) {
$this->entityMapper = $entityMapper;
}

public function update($customer) {
$customerToUpdate = $this->repository.getById($customer->id);
$this->entityMapper->mapCustomerToCustomer($customer, $customerToUpdate);

$this->repository.addOrUpdate($customerToUpdate);
}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector