Các câu trả lời cho câu hỏi này là sai. Mặc dù việc triển khai của họ có thể hoạt động, nhưng đó không phải là cách thích hợp để xử lý việc này. Cách chính xác để thực hiện việc này là sử dụng các mô hình dữ liệu và hợp đồng dịch vụ của Magentos.
Trong trường hợp này, đó là Magento\ConfigurableProduct\Api\LinkManagementInterface
hợp đồng dịch vụ bạn cần.
Một ví dụ nhỏ về mã tôi đang sử dụng trong lệnh console:
<?php
namespace Vendor\Module\Console;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\ConfigurableProduct\Api\LinkManagementInterface;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\App\State;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Class UpdateChildProducts
* @package Vendor\Module\Console
*/
class UpdateChildProducts extends Command
{
/**
* @var ProductRepositoryInterface
*/
protected $productRepository;
/**
* @var SearchCriteriaBuilder
*/
protected $searchCriteriaBuilder;
/**
* @var LinkManagementInterface
*/
protected $linkManagement;
/**
* @var State
*/
protected $state;
/**
* UpdateChildProducts constructor.
* @param State $state
* @param LinkManagementInterface $linkManagement
* @param ProductRepositoryInterface $productRepository
* @param SearchCriteriaBuilder $searchCriteriaBuilder
* @param string $name
*/
public function __construct(
State $state,
LinkManagementInterface $linkManagement,
ProductRepositoryInterface $productRepository,
SearchCriteriaBuilder $searchCriteriaBuilder,
$name = 'update_child_products'
) {
$this->state = $state;
$this->linkManagement = $linkManagement;
$this->productRepository = $productRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
parent::__construct($name);
}
/**
* Configure this command
*/
protected function configure()
{
$this->setName('example:update_child_products');
$this->setDescription('Iterate over all configurable products and show their children count.');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
// Set area code
try {
$this->state->setAreaCode('adminhtml');
} catch (\Exception $e) {
// Fail silently ...
}
$searchCriteria = $this->searchCriteriaBuilder
->addFilter('type_id', 'configurable')
->create();
$configurableProducts = $this->productRepository->getList($searchCriteria);
$output->writeln(sprintf('Found %d configurable products ...', $configurableProducts->getTotalCount()));
foreach ($configurableProducts->getItems() as $configurableProduct) {
$childProducts = $this->linkManagement->getChildren($configurableProduct->getSku());
$output->writeln(
sprintf('Found %d children for %s', count($childProducts), $configurableProduct->getSku())
);
}
}
}
Magento 2 không phù hợp với mã riêng của nó vì phần lớn mã được chuyển từ Magento 1. Đó là lý do tại sao bạn vẫn thấy phần còn lại của các mô hình dựa trên thừa kế và phương thức của chúng (như getTypeInstance()
). Nếu bạn muốn xây dựng mã Magento 2 bằng chứng trong tương lai, hãy sử dụng các hợp đồng dịch vụ và mô hình dữ liệu càng nhiều càng tốt.