Следуя моему предыдущему сообщению об удалении 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.... }
… но что-то об этом не кажется правильным, запах кода?