Следуя моему предыдущему сообщению об удалении ServiceLocatorAwareInterface из моего приложения zf2, теперь я сталкиваюсь с головоломкой, связанной с созданием объекта при использовании карт данных.
Текущая реализация моего картографирования данных использует tablegateway для поиска определенных строк, вызывает диспетчера служб для получения объекта домена, а затем заполняет и возвращает полный объект.
public function findById($userId){ $rowset = $this->gateway->select(array('id' => $userId)); $row = $rowset->current(); if (!$row) { throw new \DomainException("Could not find user with id of $userId in the database"); } $user = $this->createUser($row); return $user; } public function createUser($data){ $userModel = $this->getServiceManager()->get('Model\User'); $hydrator = $this->getHydrator(); if($data instanceof \ArrayObject){ $hydrator->hydrate($data->getArrayCopy(), $userModel); }else{ $hydrator->hydrate($data, $userModel); } return $userModel; } 
  Модель должна вызываться из диспетчера служб, потому что она имеет другие зависимости, поэтому вызов $user = new App\Model\User() изнутри устройства сопоставления не является вариантом. 
Тем не менее, теперь я удаляю экземпляры servicemanager из своего кода, я не уверен в том, как лучше всего получить модель в Mapper. Очевидный ответ – передать его в конструктор и сохранить экземпляр как свойство mapper:
  public function __construct(TableGateway $gateway, \App\Model\User $userModel){ $this->_gateway = $gateway; $this->_userModel= $userModel; } public function createUser($data){ $userModel = $this->_userModel; //....snip.... } 
  Это работает до некоторой степени, но затем несколько вызовов createUser (например, при поиске всех пользователей, например), над каждым экземпляром записывают данные последних объектов (как и следовало ожидать, но не то, что я хочу) 
  Поэтому мне нужен «новый» объект, возвращаемый каждый раз, когда я вызываю createUser , но зависимость передается в конструктор.  С моделью, переданной в конструктор, я могу клонировать объект, например. 
  public function createUser($data){ $userModel = clone $this->_userModel //....snip.... } 
… но что-то об этом не кажется правильным, запах кода?