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
- Ja, który nie potrafi poprawnie odczytać / zrozumieć komentarzy i kodu @api
- 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 .