Методы хранилища getList () в Magento 2 CMS не возвращают ожидаемый объект

10

Мне нужно удалить все страницы CMS.

Вот код:

Пространство имен Скоро \ Core \ Setup;

использовать Magento \ Cms \ Api \ PageRepositoryInterface;
использовать Magento \ Framework \ Api \ SearchCriteriaInterface;

класс Cms
{
    / **
     * @var SearchCriteriaInterface
     * /
    private $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    private $ cmsPageRepository;

    / **
     * Cms конструктор.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    публичная функция __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * Удалить все существующие страницы CMS
     * /
    публичная функция cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> GetList ($ this-> searchCriteria)
            -> GetItems ();

        foreach ($ cmsPageCollection as $ cmsPage) {
            $ This-> cmsPageRepository-> удалить ($ cmsPage);
        }
    }
}

Таким образом, вызов \Soon\Core\Setup\Cms::cleanCmsPagesдолжен удалить все страницы CMS.

Но при этом я получаю эту ошибку:

Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given

Таким образом, я сбросил $cmsPageиспользованный в моем, foreach ($cmsPageCollection as $cmsPage)и кажется, что это действительно $cmsPageмассив.

Я копался в коде:

\Magento\Cms\Api\PageRepositoryInterface::getListреализуется \Magento\Cms\Model\PageRepository::getList.

Затем \Magento\Cms\Model\PageRepository::getListмы можем увидеть этот фрагмент кода:

            $ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
                $ PageData,
                'Magento \ Cms \ Api \ Data \ PageInterface'
            );
        }
        $ SearchResults-> setItems ($ страниц);

Если я прав, этот код создает массив, который заполняет $pagesмассив. Так что этот код может объяснить, почему $cmsPageэто массив!

НО...

Читая @returnутверждение \Magento\Cms\Api\PageRepositoryInterface::getList, мы можем видеть @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

И затем, читая @returnзаявление от \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, мы можем видеть \Magento\Cms\Api\Data\PageInterface[]!

Таким образом, $cmsPageв моем foreachцикле должна быть реализация, \Magento\Cms\Api\Data\PageInterfaceкоторая затем может быть должным образом передана \Magento\Cms\Api\PageRepositoryInterface::delete.

Кто не прав?

  1. Я, кто не может читать / понимать комментарии и код @api должным образом
  2. Magento, который не дает правильный комментарий в своих классах @api ... или не реализует интерфейс так, как должен.

Этот анализ предназначен для API страницы CMS, но также применим к API блока CMS .

Эрве Гетин
источник
1
Это похоже на ошибку, кто-то недавно сообщил об этом: github.com/magento/magento2/issues/7140
Войтек Нарунец

Ответы:

2

Вы можете создать ошибку на github, если хотите. Но более быстрый способ для вас - использовать модель ресурсов или, если вы хотите, использовать этот метод репозитория deleteById (), где вы можете передать идентификатор сущности.

поставщик / Magento / модуль-К / Модель / PageRepository.php

public function deleteById($pageId)
{
    return $this->delete($this->getById($pageId));
}

Хранилища не для массовых операций, это влияет на производительность.

Саша Осадчий
источник