Magento 2 Strona CMS Metody repozytorium getList () nie zwracają oczekiwanego obiektu

10

Muszę usunąć wszystkie strony CMS.

Oto kod:

przestrzeń nazw Wkrótce \ Core \ Setup;

użyj Magento \ Cms \ Api \ PageRepositoryInterface;
użyj Magento \ Framework \ Api \ SearchCriteriaInterface;

klasa Cms
{
    / **
     * @var SearchCriteriaInterface
     * /
    prywatne $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    prywatny $ cmsPageRepository;

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

    / **
     * Usuń wszystkie istniejące strony CMS
     * /
    funkcja publiczna cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

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

Wywołanie \Soon\Core\Setup\Cms::cleanCmsPagespowinno więc usunąć wszystkie strony CMS.

Ale kiedy to robię, pojawia się ten błąd:

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

Zrzuciłem więc $cmsPagezużyte urządzenie foreach ($cmsPageCollection as $cmsPage)i wygląda na to, że rzeczywiście $cmsPagejest to tablica.

Wkopałem w kod:

\Magento\Cms\Api\PageRepositoryInterface::getListjest wdrażany przez \Magento\Cms\Model\PageRepository::getList.

Następnie \Magento\Cms\Model\PageRepository::getListmożemy zobaczyć ten fragment kodu:

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

Jeśli mam rację, ten kod tworzy tablicę, która zapełnia $pagestablicę. Więc ten kod może wyjaśnić, dlaczego $cmsPagejest tablicą!

ALE...

Czytając @returnoświadczenie \Magento\Cms\Api\PageRepositoryInterface::getList, możemy zobaczyć @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

A potem, czytając @returnoświadczenie z \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, możemy zobaczyć \Magento\Cms\Api\Data\PageInterface[]!

Więc $cmsPagew mojej foreachpętli powinna być implementacja, do \Magento\Cms\Api\Data\PageInterfacektórej można następnie poprawnie przekazać \Magento\Cms\Api\PageRepositoryInterface::delete.

Kto się myli

  1. Ja, który nie potrafi poprawnie odczytać / zrozumieć komentarzy i kodu @api
  2. Magento, który nie podaje odpowiedniego komentarza w swoich klasach @api ... lub nie implementuje interfejsu tak, jak powinien.

Ta analiza dotyczy interfejsu API strony CMS, ale dotyczy również interfejsu API CMS Block .

Hervé Guétin
źródło
1
Wygląda jak błąd, ktoś niedawno to zgłosił: github.com/magento/magento2/issues/7140
Wojtek Naruniec,

Odpowiedzi:

2

Jeśli chcesz, możesz utworzyć błąd w github. Ale szybszym sposobem jest skorzystanie z modelu zasobów lub skorzystanie z tej metody repozytorium deleteById (), w której można przekazać identyfikator encji.

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

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

Repozytoria nie są przeznaczone do operacji masowej, wpływa to na wydajność.

Саша Осадчий
źródło