Die Repository-Methoden der Magento 2 CMS-Seite getList () geben kein erwartetes Objekt zurück

10

Ich muss alle CMS-Seiten löschen.

Hier ist der Code:

Namespace Soon \ Core \ Setup;

Verwenden Sie Magento \ Cms \ Api \ PageRepositoryInterface.
Verwenden Sie Magento \ Framework \ Api \ SearchCriteriaInterface.

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

    / **
     * Cms-Konstruktor.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    öffentliche Funktion __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }}

    / **
     * Löschen Sie alle vorhandenen CMS-Seiten
     * /
    öffentliche Funktion cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

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

Ein Aufruf \Soon\Core\Setup\Cms::cleanCmsPagessollte also alle CMS-Seiten löschen.

Dabei erhalte ich folgende Fehlermeldung:

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

Also habe ich das $cmsPagein meinem verwendete verwendet foreach ($cmsPageCollection as $cmsPage)und es scheint tatsächlich $cmsPageein Array zu sein.

Ich habe mich in den Code vertieft:

\Magento\Cms\Api\PageRepositoryInterface::getListwird implementiert von \Magento\Cms\Model\PageRepository::getList.

Dann \Magento\Cms\Model\PageRepository::getListkönnen wir in diesem Code sehen:

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

Wenn ich richtig bin, erstellt dieser Code ein Array, das das $pagesArray auffüllt. Dieser Code kann also erklären, warum $cmsPagees sich um ein Array handelt!

ABER...

Durch das Lesen der @returnAussage von \Magento\Cms\Api\PageRepositoryInterface::getListkönnen wir sehen @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

Und wenn wir dann die @returnAussage von lesen \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, können wir sehen \Magento\Cms\Api\Data\PageInterface[]!

Das $cmsPagein meiner foreachSchleife sollte also eine Implementierung sein, an \Magento\Cms\Api\Data\PageInterfacedie dann richtig übergeben werden kann \Magento\Cms\Api\PageRepositoryInterface::delete.

Wer ist falsch?

  1. Ich, der @ api Kommentare und Code nicht richtig lesen / verstehen kann
  2. Magento, der in seinen @ api-Klassen nicht den richtigen Kommentar abgibt ... oder die Schnittstelle nicht so implementiert, wie sie sollte.

Diese Analyse gilt für die CMS-Seiten-API, gilt jedoch auch für die CMS- Block- API.

Hervé Guétin
quelle
1
Es sieht aus wie ein Fehler, jemand hat es kürzlich gemeldet: github.com/magento/magento2/issues/7140
Wojtek Naruniec

Antworten:

2

Sie können ein Fehlerproblem auf Github erstellen, wenn Sie möchten. Eine schnellere Möglichkeit für Sie ist jedoch die Verwendung des Ressourcenmodells oder die Verwendung dieser Repository-Methode deleteById (), bei der Sie die ID der Entität übergeben können.

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

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

Repositorys sind nicht für den Massenbetrieb vorgesehen. Dies wirkt sich auf die Leistung aus.

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