답변:
컨트롤러에서 __construct 메소드의 컨텍스트 클래스를 사용하여 객체 관리자를 초기화해야한다고 생각했을 것입니다.
Magento2에서 카테고리 ID가 필요한 경우 다음 단계에 따라 값을 얻을 수 있습니다.
1. Magento\Framework\Registry
수업 파일에 사용 을 포함시킵니다.
<?php
/**
* class file
*/
namespace Vendor\Module\Model;
use Magento\Framework\Registry;
...
2. Object Manager를 사용하여 객체를 생성하거나 컨트롤러에서 객체를 사용하는 경우 __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 () 메소드의 기능은 다음과 같습니다 .
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;
}
보다시피 레지스트리는 여전히 레지스트리를 사용하지만 실패 할 경우 폴백을 제공합니다.