это будет полностью теоретическая тема.
Давайте поговорим об изменении массивов специально для объекта, чтобы сравнить и работать с ним.
Например, у нас есть 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. есть метод, чтобы сохранить объект в источнике и получить его из источника.
Менеджер имеет всю «бизнес-логику», он может изменять сущности, используя шаблон команды, одну команду для одного свойства, поэтому бизнес-логика для всех свойств хранится в отдельной команде, а менеджер запускает ее.
Теперь в диспетчере начинаем всю логику и веселье.
Маленькая стенография:
['name' => 'New name'];
mapper решает, какая команда должна быть запущена менеджером для данного массива.Теперь, почему мы передаем массив? когда мы находимся в ООП, почему бы не использовать специальные варианты 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
,
И это все…
Есть ли какое-то имя шаблона дизайна? или как то так?
Или эта идея очень плохая?
Надеюсь, вам всем ясно, если нет, спросите.
Есть идеи ? совет ?
Что сводит меня с ума, так это то, почему вы реализуете функцию назначать значения из массива во весь класс вместо обычных регулярных присваиваний:
$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);
}
}
Других решений пока нет …