В 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, наприклад, для налагодження і тестів.
Ніколи не вказуйте на помилки, якщо не знаєте, як їх виправити Джордж Бернард Шоу
Коли необхідно зробити вибір, а ви його не робите, — це теж вибір Вільям Джеймс…
Коли ви ставите перед собою цілі, дуже важливо бути максимально конкретним. Тут не допоможе проста…
Сучасна людина думає, що втрачає час, коли не діє швидко, однак не знає, що робити…
Унікальна елегантність і довговічність: чому варто купити травертин або граніт Натуральний камінь це більше, ніж…
У сучасному світі, де щодня від нас вимагають бути в ресурсі, відповідати зовнішнім очікуванням та…