The question:
Any one know how I can get the category id using current category registry in Magento 2?
The Solutions:
Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.
Method 1
I think You have done in your controller maybe you should get the object manager to be initialized by the use of context class in the __construct
method.
Method 2
If you need the category Id in Magento2 ,then you can get the values using the following steps to be followed
1.Include the use MagentoFrameworkRegistry
in your class file.
<?php
/**
* class file
*/
namespace VendorModuleModel;
use MagentoFrameworkRegistry;
...
2.Create an object for that using object Manager or else if your using it in the controller then assign in your __construct()
function as MagentoFrameworkRegistry $registry
:
...
/**
* @var Registry
*/
class BlueLine
{
...
private $registry;
...
public function __construct(Registry $registry)
{
$this->registry = $registry;
}
...
3.Then you can simply use it with the class as:
$category = $this->registry->registry('current_category');
echo $category->getId();
For the further Reference in Magento2 Implementation of this concept refer the class file and function called public function _initCategory()
. In this method they are registering the current category.
Method 3
Try this code. this will definitely help you.
<?php
$objectManager = MagentoFrameworkAppObjectManager::getInstance();
$category = $objectManager->get('MagentoFrameworkRegistry')->registry('current_category');//get current category
echo $category->getId();
echo $category->getName();
?>
Method 4
The above to seem correct, but I think that jumping straight to the Registry is not the best approach. Magento provides a Layer Resolver that already encapsulates that functionality. (See the TopMenu Block in the Catalog Plugins)
I suggest injecting the MagentoCatalogModelLayerResolver class and using that to get the current category. Here is the code :
<?php
namespace FooBarDemoBlock;
class Demo extends MagentoFrameworkViewElementTemplate
{
private $layerResolver;
public function __construct(
MagentoFrameworkViewElementTemplateContext $context,
MagentoCatalogModelLayerResolver $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();
}
}
Here is what the actual getCurrentCategory() method does in the Resolver Class.
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;
}
As you can see, it does still use the registry but it provides a fallback in case that fails.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0