如何在magento2中获取当前类别?

如何在magento2中获取当前类别?,magento2,magento-2.0,Magento2,Magento 2.0,如何在magento2中获取当前类别 我想在自定义phtml文件中获取类别名称和类别id。试试这段代码。这肯定会对你有帮助 <?php $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $category = $objectManager->get('Magento\Framework\Registry')->registry('current_category');//

如何在magento2中获取当前类别


我想在自定义phtml文件中获取类别名称和类别id。

试试这段代码。这肯定会对你有帮助

<?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为正在访问的类别设置注册表。因此,要获取当前类别,请使用以下方法:

/**
 * @param \Magento\Framework\Registry $registry
 */

protected $_registry;

public function __construct(
    \Magento\Framework\Registry $registry
) {
    $this->_registry = $registry;
}
然后使用:

$category = $this->_registry->registry('current_category');//get current category

现在,您可以访问集合并获取详细信息,如$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();
    }
}

正如您所看到的,它仍然使用注册表,但在出现故障时提供了一个回退。

无需使用对象管理器或注入类。您可以按以下方式使用内置帮助器类
Magento\Catalog\helper\Data

<?php 
    $catalogHelperData = $this->helper('Magento\Catalog\Helper\Data');
    $categoryObject = $catalogHelperData->getCategory();
    $categoryId = $categoryObject->getId();
    $categoryName = $categoryObject->getName();
?>


此代码段适用于与产品列表页面或产品详细信息页面相关的任何phtml(内置或自定义)文件。

这是正确的回答,因为与上面选择的不同,此代码尊重依赖项注入原则,不直接在代码中使用objectManager我同意,在Magento 2中使用
ObjectManager
是不好的做法@Sarfaraj@ManishJoy注册表已被弃用,您能推荐一个新的解决方案吗?这里有一个替代方案,它不尊重依赖项注入原则我的评论被取消的原因是什么@Makwana,你最好从错误中吸取教训,分享好的做法(也许可以修正你的答案),而不是像这样欺负别人我同意@YonnTrimoreau你应该遵循依赖注入原则。直接使用对象管理器是一种糟糕的做法是的,像这样直接使用OM真的是一种糟糕的做法。From-Magento禁止在代码中直接使用ObjectManager,因为它隐藏了类的真正依赖项。好吧,它可以正常工作。但是在Magento中使用objectManager是不受欢迎的。+1没有重新发明轮子!这并不完全是OP所要求的,但由于回退机制,它可能是比其他答案更好的解决方案。我知道这是为我准备的。这里的大多数答案都使用了
注册表
类,这个类很久以来就被弃用了。有没有不使用注册表的方法?
<?php 
    $catalogHelperData = $this->helper('Magento\Catalog\Helper\Data');
    $categoryObject = $catalogHelperData->getCategory();
    $categoryId = $categoryObject->getId();
    $categoryName = $categoryObject->getName();
?>