Câu trả lời:
Tôi nghĩ Bạn đã thực hiện trong trình điều khiển của mình, có lẽ bạn nên khởi chạy trình quản lý đối tượng bằng cách sử dụng lớp ngữ cảnh trong phương thức __construct.
Nếu bạn cần Id danh mục trong Magento2, thì bạn có thể nhận các giá trị bằng cách sử dụng các bước sau
1. Bao gồm việc sử dụng Magento\Framework\Registry
trong tập tin lớp của bạn.
<?php
/**
* class file
*/
namespace Vendor\Module\Model;
use Magento\Framework\Registry;
...
2. Tạo một đối tượng cho việc sử dụng Trình quản lý đối tượng hoặc người khác nếu bạn sử dụng nó trong bộ điều khiển thì gán trong __construct()
hàm của bạn là \Magento\Framework\Registry $registry
:
...
/**
* @var Registry
*/
class BlueLine
{
...
private $registry;
...
public function __construct(Registry $registry)
{
$this->registry = $registry;
}
...
3. Sau đó, bạn có thể chỉ cần sử dụng nó với lớp như:
$category = $this->registry->registry('current_category');
echo $category->getId();
Để tham khảo thêm trong Magento2 Thực hiện khái niệm này, hãy tham khảo tệp lớp và hàm được gọi là hàm công khai _initCategory()
. Trong phương pháp này họ đang đăng ký danh mục hiện tại.
Hãy thử mã này. Điều này chắc chắn sẽ giúp bạn.
<?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();
?>
Những điều trên có vẻ đúng, nhưng tôi nghĩ rằng nhảy thẳng vào Registry không phải là cách tiếp cận tốt nhất. Magento cung cấp Trình giải quyết lớp đã đóng gói chức năng đó. (Xem Khối TopMothy trong Plugin Danh mục)
Tôi khuyên bạn nên tiêm lớp \ Magento \ Catalog \ Model \ Layer \ Resolver và sử dụng lớp đó để có được danh mục hiện tại. Đây là mã:
<?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();
}
}
Dưới đây là những gì phương thức getCienC Category () thực tế thực hiện trong Lớp 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;
}
Như bạn có thể thấy, nó vẫn sử dụng sổ đăng ký nhưng nó cung cấp dự phòng trong trường hợp không thành công.