Magento 2 - получение категорий с помощью интерфейсов в API
В Magento 2 предполагается использовать интерфейсы API Magento. Поэтому, когда вы хотите получить продукт(ы), вы должны использовать \Magento\Catalog\Api\ProductRepositoryInterface
. Это отлично работает и очень удобно.
Теперь, когда я хочу получить список категорий, основанный на моих критериях поиска. Как лучше всего подойти к этому? Я действительно не вижу вариантов, потому что:
-
\Magento\Catalog\Api\CategoryRepositoryInterface
поддерживает только одну сущность, нетgetList()
или что-то в этом роде. -
\Magento\Catalog\Model\ResourceModel\Category\Collection\Factory
используется много из того, что Я видел из кода сообщества. Однако этот класс устарел, что явно означает, что его не следует использовать. -
\Magento\Catalog\Model\CategoryFactory
также часто используется. Это динамически генерируемая фабрика. Разработчики использовали бы эту фабрику для создания модели категории и получения ее коллекции. Мне это кажется действительно ужасным, но я думаю, что это правильный путь...
2 answers
Примерно через год Magento естественным образом эволюционировал, и теперь Magento\Catalog\Api\CategoryListInterface
можно использовать.
Это отлично работает, я могу делать такие вещи, как это:
/**
* @var CategoryListInterface
*/
private $categoryListRepository;
/**
* @var SearchCriteriaBuilder
*/
private $searchCriteriaBuilder;
/**
* CategoryList constructor.
* @param CategoryListInterface $categoryList
* @param SearchCriteriaBuilder $searchCriteriaBuilder
* @SuppressWarnings(PHPMD.LongVariableNames)
*/
public function __construct(
CategoryListInterface $categoryListRepository,
SearchCriteriaBuilder $searchCriteriaBuilder
) {
$this->categoryListRepository = $categoryListRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
}
/**
* @param int $parentId
* @return CategoryInterface[]
*/
public function getCategories(int $parentId): array
{
$this->searchCriteriaBuilder->addFilter('parent_id', $parentId);
$searchCriteria = $this->searchCriteriaBuilder->create();
$results = $this->categoryListRepository->getList($searchCriteria);
return $results->getItems();
}
Ответ Mpw также полезен и поддерживается Magento, но мой вопрос был направлен на метод контракта на обслуживание.
Поскольку Magento\Catalog\Model\ResourceModel\Category\Collection
имеет аннотацию @api
(начиная с 2.2), похоже, что Magento официально санкционировал старый стиль.
Вместо того, чтобы использовать устаревший \Magento\Catalog\Model\ResourceModel\Category\Collection\Factory
, я считаю, что Magento предпочел бы использовать \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory
, который сгенерирован и не имеет устаревания.