Как создать экземпляр модели в 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, например, для отладки и тестов.