Categories: Мадженто 2

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

Tags: Magento2

Recent Posts

Признаки качественного хостинга: выбираем с умом

Хостингом называется специальное пространство, предназначенное для хранения файлов веб-сайта. Клиентам доступны разные типы размещения и… Read More

30/09/2020

Как выучить немецкий язык легко и весело? С помощью Beste Freunde!

Немецкий часто считается сложным языком. Да, немецкая лексика имеет «тяжелый» характер. Да, есть действительно очень… Read More

27/09/2020

Отопление и горячая вода – когда нужно, а не когда соизволят включить

Тепло в доме и горячая вода в любое время для многих жителей многоквартирных и частных… Read More

19/09/2020

Инструкция по скачиванию видео с сервиса TikTok (бесплатно и без watermark)

Если вы еще не слышали о TikTok, тогда рекомендуем вам сначала ознакомиться с этим кратким… Read More

17/09/2020

Что есть в бюджетном ноутбуке – на какие характеристики рассчитывать?

Прошли те времена, когда приличный ноутбук стоил от 1000 долларов. Сегодня можно купить довольно неплохой… Read More

16/09/2020

Что лучше – цифровое телевидение Т2 или интернет-телевидение?

Современную жизнь невозможно представить без телевидения. Оно позволяет узнавать о событиях в Украине и мире,… Read More

02/09/2020