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, наприклад, для налагодження і тестів.

Recent Posts

Опалення і гаряча вода коли треба, а не коли включать

Тепло в домі і гаряча вода в будь-який час для багатьох мешканців багатоквартирних та приватних… Read More

19/09/2020

Що краще: цифрове телебачення Т2 чи інтернет-телебачення

Сучасне життя неможливо уявити без телебачення. Воно дозволяє дізнаватися про події в Україні та світі,… Read More

02/09/2020

Гіпоалергенна подушка. Чому вона важлива?

Зараз знайдеться мало людей, в яких немає алергії на продукти або пилок рослин. Вважається, що… Read More

28/08/2020

Футбольний Інстаграм – що нового у топових футболістів

Деякі відомі футболісти ретельно приховують свої особисте життя, а інші – активно постять фотографії з… Read More

24/08/2020

Види та типи компресійних панчіх

Вироби називають компресійними, коли їх застосовують для лікування, а також профілактики порушень кровотоку в нижніх… Read More

22/08/2020

Як правильно замінити оливу у двотактному гідроциклі?

Гідроцикли – це класний плавзасіб, який може подарувати вам незліченні години приємного проведення часу на… Read More

19/08/2020