回答:
__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は、その機能を既にカプセル化したレイヤーリゾルバーを提供します。(カタログプラグインの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()メソッドがリゾルバークラスで行うことを示します。
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;
}
ご覧のとおり、まだレジストリを使用していますが、失敗した場合のフォールバックを提供します。