Відповіді:
Я думаю, що ви зробили в своєму контролері, можливо, вам слід отримати ініціалізацію менеджера об'єктів за допомогою контекстного класу в методі __construct.
Якщо вам потрібна категорія Id в 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 Реалізація цієї концепції зверніться до файлу класу та функції, званої public function _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 \ Catalog \ Model \ Layer \ Resolver і використовувати його для отримання поточної категорії. Ось код:
<?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 () у класі Resolver.
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;
}
Як ви бачите, він все ще використовує реєстр, але він забезпечує резервний випадок у випадку невдачі.