Magento 2 get current category Id using registry

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

Leave a Comment