В 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, например, для отладки и тестов.
WordPress годами был непревзойденным "монолитом": он отвечал и за удобную админ-панель, и за хранение данных,…
В мире веб-серверов часто говорят о противостоянии Nginx vs Apache. Но что, если бы я…
Когда я начинал свой путь в веб-разработке, вопрос "какой веб-сервер использовать?" практически не стоял. Ответ…
Когда речь заходит о веб-серверах, два имени всегда на слуху: Apache и Nginx. Apache —…
В мире веб-разработки мы постоянно сталкиваемся с проблемой: "А у меня на компьютере все работает!".…
На заре моей карьеры веб-разработчика все было относительно просто: установил локальный сервер (помните Denwer?), положил…