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 также часто используется. Это динамически генерируемая фабрика. Разработчики использовали бы эту фабрику для создания модели категории и получения ее коллекции. Мне это кажется действительно ужасным, но я думаю, что это правильный путь...
Author: Timon de Groot, 2017-05-22

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, но мой вопрос был направлен на метод контракта на обслуживание.

 5
Author: Timon de Groot, 2018-05-14 06:46:06

Поскольку Magento\Catalog\Model\ResourceModel\Category\Collection имеет аннотацию @api (начиная с 2.2), похоже, что Magento официально санкционировал старый стиль.

Вместо того, чтобы использовать устаревший \Magento\Catalog\Model\ResourceModel\Category\Collection\Factory, я считаю, что Magento предпочел бы использовать \Magento\Catalog\Model\ResourceModel\Category\CollectionFactory, который сгенерирован и не имеет устаревания.

 1
Author: mpw, 2018-05-09 01:08:43