Os métodos de repositório getList () da página Magento 2 CMS não retornam o objeto esperado

10

Eu preciso excluir todas as páginas do CMS.

Aqui está o código:

espaço para nome Soon \ Core \ Setup;

use Magento \ Cms \ Api \ PageRepositoryInterface;
use Magento \ Framework \ Api \ SearchCriteriaInterface;

classe Cms
{
    / **
     * @var SearchCriteriaInterface
     * /
    private $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    private $ cmsPageRepository;

    / **
     * Construtor Cms.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    função pública __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * Exclua todas as páginas existentes do CMS
     * /
    função pública cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection como $ cmsPage) {
            $ this-> cmsPageRepository-> delete ($ cmsPage);
        }
    }
}

Portanto, a chamada \Soon\Core\Setup\Cms::cleanCmsPagesdeve excluir todas as páginas do CMS.

Mas ao fazer isso, recebo este erro:

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

Então eu joguei o $cmsPageusado no meu foreach ($cmsPageCollection as $cmsPage)e parece que, de fato, $cmsPageé uma matriz.

Eu procurei no código:

\Magento\Cms\Api\PageRepositoryInterface::getListé implementado por \Magento\Cms\Model\PageRepository::getList.

Então \Magento\Cms\Model\PageRepository::getList, podemos ver este pedaço de código:

            $ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
                $ pageData,
                'Magento \ Cms \ Api \ Data \ PageInterface'
            );
        }
        $ searchResults-> setItems ($ páginas);

Se eu estiver correto, esse código cria uma matriz que preenche a $pagesmatriz. Portanto, este código pode explicar por que $cmsPageé uma matriz!

MAS...

Ao ler a @returndeclaração de \Magento\Cms\Api\PageRepositoryInterface::getList, podemos ver @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

E, então, lendo a @returndeclaração de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, podemos ver \Magento\Cms\Api\Data\PageInterface[]!

Portanto, o loop $cmsPageno meu foreachloop deve ser uma implementação da \Magento\Cms\Api\Data\PageInterfacequal pode ser passado corretamente para \Magento\Cms\Api\PageRepositoryInterface::delete.

Quem esta errado?

  1. Eu que não consigo ler / entender os comentários e códigos da @api corretamente
  2. Magento que se não dá o comentário certo em suas classes @api ... ou não implementa a interface como deveria.

Essa análise é para a API da página do CMS, mas também se aplica à API do bloco do CMS .

Hervé Guétin
fonte
1
Parece bug, alguém relatou recentemente: github.com/magento/magento2/issues/7140 #
Wojtek Naruniec 2/16

Respostas:

2

Você pode criar um problema de bug no github, se quiser. Mas a maneira mais rápida para você é usar o modelo de recursos ou se você quiser usar este método de repositório deleteById (), no qual você pode passar o ID da entidade.

fornecedor / magento / module-cms / Model / PageRepository.php

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

Repositórios não são para operação em massa, isso afeta o desempenho.

Саша Осадчий
fonte