Intereting Posts
Изображение невозможно отобразить, поскольку оно содержит ошибку в php gd Простая замена шаблона var, но с завихрением хотите вызвать один файл phtml в другом файле phtml с помощью тега привязки Несколько паролей Логин: Хорошо ИЛИ Плохо Какая из них лучше? используя собственный алгоритм шифрования или используя md5 / sha1? Вставка данных с помощью mysqli PHP API Google Analytics – простой пример Почему функции mysql_ PHP устарели? Как создать экземпляр / вызвать java-класс с параметром из PHP? Знакомство с MVC – как я могу работать с логикой сеанса, дополнительными классами и фоновой логикой Какими должны быть ресурсы в ACL? Модели объектов или экземпляры объектов? использовать Joins для нескольких таблиц в yii2 Кросс-компиляция PHP с помощью UCLIBC функция переключения между сингулярным и множественным числом? Чтение изображения извне public_html с помощью PHP?

zf2 – создание моделей (с зависимостями) в mapper без servicemanager

Следуя моему предыдущему сообщению об удалении 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.... } 

… но что-то об этом не кажется правильным, запах кода?