Odpowiedzi:
Myślę, że zrobiłeś w swoim kontrolerze być może powinieneś zainicjować menedżera obiektów za pomocą klasy kontekstu w metodzie __construct.
Jeśli potrzebujesz identyfikatora kategorii w Magento2, możesz uzyskać wartości, wykonując następujące kroki
1. Uwzględnij użycie Magento\Framework\Registry
w swoim pliku klasy.
<?php
/**
* class file
*/
namespace Vendor\Module\Model;
use Magento\Framework\Registry;
...
2. Stwórz obiekt dla tego za pomocą Object Managera lub jeśli używasz go w kontrolerze, przypisz w swojej __construct()
funkcji jako \Magento\Framework\Registry $registry
:
...
/**
* @var Registry
*/
class BlueLine
{
...
private $registry;
...
public function __construct(Registry $registry)
{
$this->registry = $registry;
}
...
3. Następnie możesz po prostu użyć go z klasą jako:
$category = $this->registry->registry('current_category');
echo $category->getId();
Dalsze informacje na temat implementacji tej koncepcji w Magento2 znajdują się w pliku klasy i funkcji o nazwie funkcja publiczna _initCategory()
. W tej metodzie rejestrują bieżącą kategorię.
Wypróbuj ten kod. to na pewno ci pomoże.
<?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();
?>
Powyższe wydaje się poprawne, ale myślę, że przejście do rejestru nie jest najlepszym podejściem. Magento zapewnia Layer Resolver, który już zawiera tę funkcjonalność. (Zobacz blok TopMenu we wtyczkach katalogu)
Sugeruję wstrzyknięcie klasy \ Magento \ Catalog \ Model \ Layer \ Resolver i użycie jej do uzyskania bieżącej kategorii. Oto kod:
<?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();
}
}
Oto, co robi rzeczywista metoda getCurrentCategory () w klasie 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;
}
Jak widać, nadal korzysta z rejestru, ale zapewnia awarię w przypadku niepowodzenia.