Les méthodes du référentiel getList () de la page CMS Magento 2 ne retournent pas l'objet attendu

10

J'ai besoin de supprimer toutes les pages CMS.

Voici le code:

espace de noms Soon \ Core \ Setup;

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

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

    / **
     * Constructeur Cms.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    fonction publique __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * Supprimer toutes les pages CMS existantes
     * /
    fonction publique cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

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

Ainsi, l'appel \Soon\Core\Setup\Cms::cleanCmsPagesdevrait supprimer toutes les pages CMS.

Mais ce faisant, j'obtiens cette erreur:

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

J'ai donc vidé le $cmsPageutilisé dans mon foreach ($cmsPageCollection as $cmsPage)et il semble que, en effet, $cmsPageest un tableau.

J'ai fouillé dans le code:

\Magento\Cms\Api\PageRepositoryInterface::getListest implémenté par \Magento\Cms\Model\PageRepository::getList.

Ensuite \Magento\Cms\Model\PageRepository::getList, nous pouvons voir ce morceau de code:

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

Si j'ai raison, ce code crée un tableau qui remplit le $pagestableau. Donc, ce code peut expliquer pourquoi $cmsPageun tableau!

MAIS...

En lisant la @returndéclaration de \Magento\Cms\Api\PageRepositoryInterface::getList, nous pouvons voir @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

Et puis, en lisant la @returndéclaration de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, nous pouvons voir \Magento\Cms\Api\Data\PageInterface[]!

Donc, $cmsPagedans ma foreachboucle doit être une implémentation \Magento\Cms\Api\Data\PageInterfacequi peut ensuite être correctement transmise à \Magento\Cms\Api\PageRepositoryInterface::delete.

Qui a tort?

  1. Moi qui ne peux pas lire / comprendre correctement les commentaires et le code @api
  2. Magento qui ne donne pas le bon commentaire dans ses classes @api ... ou n'implémente pas l'interface comme il se doit.

Cette analyse concerne l'API CMS Page, mais s'applique également à l' API CMS Block .

Hervé Guétin
la source
1
Cela ressemble à un bug, quelqu'un l'a signalé récemment: github.com/magento/magento2/issues/7140
Wojtek Naruniec

Réponses:

2

Vous pouvez créer un problème de bogue sur github si vous le souhaitez. Mais le moyen le plus rapide pour vous est d'utiliser le modèle de ressource ou si vous voulez utiliser cette méthode de référentiel deleteById () où vous pouvez passer l'id de l'entité.

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

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

Les référentiels ne sont pas destinés à un fonctionnement en bloc, cela affecte les performances.

Саша Осадчий
la source