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::cleanCmsPages
powinno 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 $cmsPage
zużyte urządzenie foreach ($cmsPageCollection as $cmsPage)
i wygląda na to, że rzeczywiście $cmsPage
jest to tablica.
Wkopałem w kod:
\Magento\Cms\Api\PageRepositoryInterface::getList
jest wdrażany przez \Magento\Cms\Model\PageRepository::getList
.
Następnie \Magento\Cms\Model\PageRepository::getList
moż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 $pages
tablicę. Więc ten kod może wyjaśnić, dlaczego $cmsPage
jest tablicą!
ALE...
Czytając @return
oświadczenie \Magento\Cms\Api\PageRepositoryInterface::getList
, możemy zobaczyć @return \Magento\Cms\Api\Data\PageSearchResultsInterface
.
A potem, czytając @return
oświadczenie z \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, możemy zobaczyć \Magento\Cms\Api\Data\PageInterface[]
!
Więc $cmsPage
w mojej foreach
pętli powinna być implementacja, do \Magento\Cms\Api\Data\PageInterface
któ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 .
Odpowiedzi:
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
Repozytoria nie są przeznaczone do operacji masowej, wpływa to na wydajność.
źródło