Как создать экземпляр модели в Magento 2
В Magento 1-й версии мы легко создавали экземпляр модели, используя методы Mage::getModel
и Mage::getSingleton
. Но в Magento 2 эта процедура немного другая.
В Magento 2 мы можем создать экземпляр модели с помощью диспетчера объектов (Object Manager). Здесь диспетчер объектов является заменой для методов getModel
и getSingleton
.
2 способа создания экземпляра модели в Magento 2
В Magento 2 есть два способа, с помощью которых вы можете вызвать Object Manager для создания экземпляра модели или для получения коллекции модели.
Способ №1: Использование Object Manager напрямую в любом месте
Допустим, мы хотим получить коллекцию товаров в phtml-файле нашего пользовательского модуля (или темы) Magento 2. Это можно сделать с помощью следующего кода:
<?php $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $productCollection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\CollectionFactory'); $productCollection->addAttributeToSelect('*'); $productCollection->load(); foreach ($productCollection as $product) { var_dump($product->getData()); }
Способ №2: Сделать инъекцию зависимостей модели в конструкторе и создать экземпляр
Второй (и рекомендуемый) подход для создания экземпляра модели в Magento 2 – это использование конструктора и инъекции зависимостей. Чтобы получить коллекцию товара в вашем пользовательском phtml
файле, вам нужно создать файл Блока и внедрить модель товара в конструктор этого Блока.
Шаг №1: Создание файла Блока
Для примера файл Блока Index.php
находится в app/code/{VENDOR}/{MODULE}/Block/Index
<?php namespace {VENDOR}\{MODULE}\Block\Index; class Index extends \Magento\Framework\View\Element\Template { protected $_productCollectionFactory; public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, array $data = [] ) { $this->_productCollectionFactory = $productCollectionFactory; parent::__construct($context, $data); } public function getProductCollection() { $collection = $this->_productCollectionFactory->create(); $collection->addAttributeToSelect('*'); return $collection; } }
Шаг №2. Вызов метода getProductCollection в phtml-файле
Для примера файл шаблона get-prod-collection.phtml
находится в app/code/{VENDOR}/{MODULE}/view/frontend/templates
<?php $prodCollection = $block->getProductCollection(); foreach ($prodCollection as $product) { var_dump($product->getData()); }
Вот мы и рассмотрели 2 способа получения коллекции товара в phtml
файле.
Какой подход использовать?
Согласно Официальной документации Magento 2, вы всегда должны использовать метод конструктора для создания экземпляра модели, чтобы поддерживать реализацию внедрения зависимостей. Вот прямая цитата:
Magento prohibits the direct use of the ObjectManager in your code because it hides the real dependencies of a class.
Magento запрещает прямое использование ObjectManager в вашем коде, потому что оно скрывает реальные зависимости класса.Magento DevDocs
Соответственно, выбор не велик :). Но вы можете использовать 1-й способ с прямым обращением к ObjectManager, например, для отладки и тестов.
Последние посты
Демокрит
Мы не столько нуждаемся в помощи друзей, сколько в уверенности, что мы ее получим Демокрит… Читать далее
Майк Тайсон
Когда мне тяжело, я всегда напоминаю себе о том, что если я сдамся — лучше… Читать далее
25 полезных советов и решений jQuery, которые вы должны знать
jQuery — это быстрая и довольно таки небольшая библиотека JavaScript. Она упрощает создание интерактивных и… Читать далее
Иоганн Вольфганг фон Гете
Каждый слышит только то, что он понимает Иоганн Вольфганг фон Гете Читать далее
Сайт для парикмахерской Teti Bond
Описание проекта: Разработка официального сайта для парикмахерской Teti Bond в городе Житомир. Парикмахерская ориентирована… Читать далее
Как полностью и без следа удалить плагин в WordPress
Плагины являются неотъемлемой частью функционирования WordPress, ведь с их помощью можно добиться практически неограниченной расширяемости… Читать далее