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

 

This post was last modified on 29/06/2019 20:54

Share
Tags: Magento2
Поддержи проект
Угости меня кофе

Buy Me A Coffee ☕😊💕

 

 

Последние посты

Генри Форд

Человек имеет два мотива поведения — один настоящий и второй, который красиво звучит Генри Форд…

16/07/2024

Фридрих Ницше

Не нужно додумывать слишком много. Так вы создаете проблемы, которых изначально не было Фридрих Ницше…

11/07/2024

Такой разный инвертор! Выбираем между кондиционерами Inverter, Inverter DC и Full DC

Лето в разгаре, а значит самое время задуматься о покупке кондиционера. Но как не потеряться…

06/07/2024

Омар Хайям

Настоящий друг — это человек, который в глаза тебе выскажет все, что о тебе думает,…

30/06/2024

Полезные советы по выбору раздвижной двери

Следует знать, что функциональность и дизайн работают рука об руку, когда вы используете раздвижную дверь.…

29/06/2024

Гераклит

Единственное, что есть в нашей жизни постоянного, — это перемены. Нет ничего более постоянного, чем…

23/06/2024