Ответы на этот вопрос неверны. Хотя их реализации могут работать, это неправильный способ справиться с этим. Правильный способ сделать это - использовать сервисные контракты Magentos и модели данных.
В этом случае Magento\ConfigurableProduct\Api\LinkManagementInterface
вам нужен сервисный договор.
Небольшой пример кода, который я использую в консольной команде:
<?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 не очень соответствует его собственному коду, так как большая часть кода перенесена из Magento 1. Именно поэтому вы все еще видите остатки моделей, основанных на наследовании, и их методов (например getTypeInstance()
). Если вы хотите создать код Magento 2, ориентированный на будущее, максимально используйте контракты на обслуживание и модели данных.