Answers:
我认为您在控制器中所做的可能是您应该通过使用__construct方法中的上下文类来初始化对象管理器。
如果您需要在Magento2中使用类别ID,则可以按照以下步骤获取值
1. Magento\Framework\Registry
在类文件中包含用法。
<?php
/**
* class file
*/
namespace Vendor\Module\Model;
use Magento\Framework\Registry;
...
2.使用对象管理器为此对象创建一个对象,否则,如果您在控制器中使用该对象,则将您的__construct()
功能分配为\Magento\Framework\Registry $registry
:
...
/**
* @var Registry
*/
class BlueLine
{
...
private $registry;
...
public function __construct(Registry $registry)
{
$this->registry = $registry;
}
...
3.然后您可以简单地将其与类一起使用:
$category = $this->registry->registry('current_category');
echo $category->getId();
有关Magento2实现的更多参考,请参见类文件和称为public function的函数_initCategory()
。他们使用这种方法注册当前类别。
试试这个代码。这一定会对您有帮助。
<?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提供了已经封装了该功能的Layer Resolver。(请参阅目录插件中的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();
}
public function getCurrentCategoryId()
{
return $this->getCurrentCategory()->getId();
}
}
这是实际的getCurrentCategory()方法在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;
}
如您所见,它仍然使用注册表,但是在失败的情况下提供了备用。