Antworten:
Ich denke, Sie haben in Ihrem Controller getan, möglicherweise sollten Sie den Objektmanager mithilfe der Kontextklasse in der __construct-Methode initialisieren lassen.
Wenn Sie die Kategorie-ID in Magento2 benötigen, können Sie die Werte anhand der folgenden Schritte ermitteln
1.Nehmen Sie die Verwendung Magento\Framework\Registry
in Ihre Klassendatei auf.
<?php
/**
* class file
*/
namespace Vendor\Module\Model;
use Magento\Framework\Registry;
...
2.Erstellen Sie ein Objekt dafür mit dem Objekt-Manager oder, falls Sie es in der Steuerung verwenden, weisen Sie es in Ihrer __construct()
Funktion zu als \Magento\Framework\Registry $registry
:
...
/**
* @var Registry
*/
class BlueLine
{
...
private $registry;
...
public function __construct(Registry $registry)
{
$this->registry = $registry;
}
...
3. Dann können Sie es einfach mit der Klasse verwenden als:
$category = $this->registry->registry('current_category');
echo $category->getId();
Weitere Informationen zur Implementierung dieses Konzepts in Magento2 finden Sie in der Klassendatei und der Funktion public function _initCategory()
. Bei dieser Methode registrieren sie die aktuelle Kategorie.
Versuchen Sie diesen Code. das wird dir definitiv helfen.
<?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();
?>
Das Obige scheint korrekt zu sein, aber ich denke, dass es nicht der beste Ansatz ist, direkt in die Registrierung zu springen. Magento bietet einen Layer Resolver, der diese Funktionalität bereits enthält. (Siehe den TopMenu Block in den Catalog Plugins)
Ich schlage vor, die Klasse \ Magento \ Catalog \ Model \ Layer \ Resolver zu injizieren und diese zu verwenden, um die aktuelle Kategorie abzurufen. Hier ist der Code:
<?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();
}
}
Die Methode getCurrentCategory () in der Resolver-Klasse führt die folgenden Aktionen aus.
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;
}
Wie Sie sehen, wird die Registrierung weiterhin verwendet, es wird jedoch ein Fallback für den Fall bereitgestellt, dass dies fehlschlägt.