В Magento 1-й версії ми легко створювали екземпляр моделі, використовуючи методи Mage::getModel
і Mage::getSingleton
. Але в Magento 2 ця процедура трохи інша.
В Magento 2 ми можемо створити екземпляр моделі за допомогою диспетчера об’єктів (Object Manager). Тут диспетчер об’єктів є заміною для методів getModel
та getSingleton
.
В 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, наприклад, для налагодження і тестів.
Цей урок є продовженням серії про роботу з запитами до бази даних WP_Query у ВордПрес.…
Як ліки не завжди приємні, так і істина буває сувора Григорій Сковорода
Цей урок є продовженням серії про роботу з запитами до бази даних WP_Query у ВордПрес.…
Без плагінів WordPress – це просто чистий аркуш. Щоб сайт працював швидко, був безпечним і…
Клас WP_Query — це потужний інструмент, з допомогою якого можна максимально контролювати надсилання запитів до…