У меня довольно большой опыт работы с Magento, но я понял, что не понимаю, какой способ загрузки модели является правильным и почему. Я прочитал все, что мог, об этой теме, но люди, объясняющие подобные вещи, никогда не заходили достаточно глубоко, чтобы объяснить, зачем использовать этот конкретный метод вместо другого. Давайте предположим, что нет репозитория для модели, которую я хочу загрузить.
До сих пор я всегда использовал модель в конструкторе, а затем просто загружал ее.
public function __construct(
\Vendor\Module\Model\Something $somethingModel
) {
$this->somethingModel = $somethingModel;
}
public function getTestById($id) {
return $this->somethingModel->load($id);
}
И это всегда работало как задумано, я также уверен, что он или, по крайней мере, широко использовался в ядре.
Но потом я увидел, как один из моих коллег использовал
modelFactory->create()->load($id)
Насколько я понимаю, фабрики используются для создания новой сущности, например, если я хочу создать новый продукт, я могу создать фабрику, заполнить ее данными, а затем сохранить. Но с другой стороны, я начал исследовать эту тему и увидел пример от Фабиана Шменглера ( когда мы должны использовать репозиторий и фабрику в Magento 2? ), Который загружал модель таким образом, а также отговаривал других от простой загрузки моделей, он не объяснить, хотя, кроме того, что он «не является частью договора на обслуживание». Насколько я понимаю, репозитории являются частью сервисных контрактов, поэтому я не вижу здесь никакой связи, когда речь идет о загрузке моделей, которые недоступны через репозиторий.
Чтобы добавить еще больше путаницы, я также нашел способ загрузки модели, получая resourceModel из созданной modelFactory, он был представлен Vinai Kopp ( Как реализовать контракт на обслуживание для пользовательского модуля в Magento 2? ), И теперь я полностью потерян, поскольку я всегда читал, что я не должен использовать модели ресурсов напрямую.
Так что да, кто-то может сказать мне, какой путь правильный и почему я должен использовать его вместо всех других методов?
Ответы:
Итак, первый шаг, который вы должны проверить для рассматриваемой модели: есть ли контракт на обслуживание репозитория? Если это так, используйте это, потому что Сервисные контракты связаны с семантическим версионированием и будут продолжать вести себя так, как должны, вплоть до выхода Magento 3.x. Само собой разумеется, что когда вы создаете свои собственные модули с моделями, которые требуют постоянства, вы также должны написать репозиторий для этого.
Если репозиторий отсутствует, используйте модель ресурсов . Обратите внимание, что модели ресурсов не содержат состояния: они используют постоянство для своих «обычных» моделей. Поэтому вы не обязаны включать их, используя фабрику:
«Так какое же преимущество приносит контракт на обслуживание / репозиторий по сравнению с моделью ресурсов?» Вы можете спросить. Что ж, теоретически Модель ресурсов должна отвечать только за постоянство Модели данных , тогда как Репозиторий также учитывает дополнительные задачи, связанные с сохранением объекта. Подумайте об обновлении индексов, создании отношений с другими объектами и т. Д. Это теория, хотя в реальной жизни эти линии часто размываются. Но для себя хорошо иметь это в виду.
Вы не должны использовать модели прямой
save()
,load()
и т.д. -методы. Они устарели, потому что это семантически неверно. Подумайте об этом в твердом виде:И именно этот последний момент имеет значение: когда вы общаетесь с другими модулями, в идеальном мире никогда не нужно полагаться на внутреннюю постоянную логику этих модулей (или любой из ее открытых методов в этом отношении, но это другое обсуждение), но используйте только ту функциональность, которая предусмотрена в контрактах на обслуживание модулей .
В заключении
Ответить на ваш вопрос: в порядке предпочтения. Правильный способ загрузки модели:
источник
Models
является Интерфейс передачи данных используется только хранить данные в объектах, то есть доset
иget
данных для строки.ResourceModels
являются механизмом, который отвечает за сохранность таких данных, т.е. выполняет запрос SQL к действительностиsave
илиload
данные вModel
объект.Правильный способ
load
иsave
должен быть путем создания хранилища или загрузки из ресурса следующим образом:Здесь
\MyVendor\MyModule\Api\Data\QueueInterface
подразумеваетсяQueue
модель.Так, за кулисами, мы на самом деле создаем
Model
объект , тоloading
его наResourceModel
объекте. Это правильный способ загрузки или сохранения.источник