Magento 2 получить текущий идентификатор категории с помощью реестра
Кто-нибудь знает, как я могу получить идентификатор категории, используя текущий реестр категорий в Magento 2?
4 answers
Я думаю, что вы сделали в своем контроллере, возможно, вам следует инициализировать диспетчер объектов с помощью класса контекста в методе __construct
.
Если вам нужен идентификатор категории в Magento2, то вы можете получить значения, выполнив следующие действия
1. Включите использование Magento\Framework\Registry
в файл класса.
<?php
/**
* class file
*/
namespace Vendor\Module\Model;
use Magento\Framework\Registry;
...
2. Создайте объект для этого с помощью диспетчера объектов или, если вы используете его в контроллере, назначьте в своей функции __construct()
как \Magento\Framework\Registry $registry
:
...
/**
* @var Registry
*/
class BlueLine
{
...
private $registry;
...
public function __construct(Registry $registry)
{
$this->registry = $registry;
}
...
3. Затем вы можете просто использовать его с классом как:
$category = $this->registry->registry('current_category');
echo $category->getId();
Для получения дополнительной информации о реализации этой концепции в Magento2 обратитесь к файл класса и функция, называемая общедоступной функцией _initCategory()
. В этом методе они регистрируют текущую категорию.
Попробуйте этот код. это определенно поможет вам.
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');//get current category
echo $category->getId();
echo $category->getName();
?>
Вышесказанное кажется правильным, но я думаю, что переход сразу к реестру - не лучший подход. Magento предоставляет распознаватель слоев, который уже инкапсулирует эту функциональность. (Смотрите Блок TopMenu в плагинах каталога)
Я предлагаю ввести класс \Magento\Каталог\Модель\Слой\Преобразователь и использовать его для получения текущей категории. Вот код:
<?php
namespace FooBar\Demo\Block;
class Demo extends \Magento\Framework\View\Element\Template
{
private $layerResolver;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\Layer\Resolver $layerResolver,
array $data = []
) {
parent::__construct($context, $data);
$this->layerResolver = $layerResolver;
}
public function getCurrentCategory()
{
return $this->layerResolver->get()->getCurrentCategory();
}
public function getCurrentCategoryId()
{
return $this->getCurrentCategory()->getId();
}
}
Вот что делает фактический метод getcurrentcategory() в преобразователе Класс.
public function getCurrentCategory()
{
$category = $this->getData('current_category');
if ($category === null) {
$category = $this->registry->registry('current_category');
if ($category) {
$this->setData('current_category', $category);
} else {
$category = $this->categoryRepository->get($this->getCurrentStore()->getRootCategoryId());
$this->setData('current_category', $category);
}
}
return $category;
}
Как вы можете видеть, он по-прежнему использует реестр, но обеспечивает запасной вариант на случай сбоя.