Saya perlu menghapus semua halaman CMS.
Ini kodenya:
namespace Soon \ Core \ Setup; gunakan Magento \ Cms \ Api \ PageRepositoryInterface; gunakan Magento \ Framework \ Api \ SearchCriteriaInterface; kelas Cms { / ** * @var SearchCriteriaInterface * / private $ searchCriteria; / ** * @var PageRepositoryInterface * / private $ cmsPageRepository; / ** * Cms constructor. * @param SearchCriteriaInterface $ searchCriteria * @param PageRepositoryInterface $ cmsPageRepository * / fungsi publik __construct ( SearchCriteriaInterface $ searchCriteria, PageRepositoryInterface $ cmsPageRepository ) { $ this-> searchCriteria = $ searchCriteria; $ this-> cmsPageRepository = $ cmsPageRepository; } / ** * Hapus semua halaman CMS yang ada * / fungsi publik cleanCmsPages () { $ cmsPageCollection = $ this-> cmsPageRepository -> getList ($ this-> searchCriteria) -> getItems (); foreach ($ cmsPageCollection sebagai $ cmsPage) { $ this-> cmsPageRepository-> delete ($ cmsPage); } } }
Jadi, panggilan \Soon\Core\Setup\Cms::cleanCmsPages
harus menghapus semua halaman CMS.
Tetapi ketika melakukannya, saya mendapatkan kesalahan ini:
Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given
Jadi saya membuang yang $cmsPage
digunakan di saya foreach ($cmsPageCollection as $cmsPage)
dan tampaknya, memang, $cmsPage
adalah array.
Saya menggali ke dalam kode:
\Magento\Cms\Api\PageRepositoryInterface::getList
diimplementasikan oleh \Magento\Cms\Model\PageRepository::getList
.
Kemudian \Magento\Cms\Model\PageRepository::getList
, kita bisa melihat sedikit kode ini:
$ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray ( $ pageData, 'Magento \ Cms \ Api \ Data \ PageInterface' ); } $ searchResults-> setItems ($ pages);
Jika saya benar, kode ini membuat array yang mengisi $pages
array. Jadi kode ini dapat menjelaskan mengapa $cmsPage
sebuah array!
TAPI...
Dengan membaca @return
pernyataan \Magento\Cms\Api\PageRepositoryInterface::getList
, kita bisa melihat @return \Magento\Cms\Api\Data\PageSearchResultsInterface
.
Dan, kemudian dengan membaca @return
pernyataan dari \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, kita bisa melihat \Magento\Cms\Api\Data\PageInterface[]
!
Jadi $cmsPage
dalam foreach
loop saya harus merupakan implementasi \Magento\Cms\Api\Data\PageInterface
yang kemudian dapat diteruskan dengan benar \Magento\Cms\Api\PageRepositoryInterface::delete
.
Siapa yang salah
- Saya yang tidak bisa membaca / memahami komentar dan kode @api dengan benar
- Magento yang entah tidak memberikan komentar yang tepat di kelas @api mereka ... atau tidak mengimplementasikan antarmuka sebagaimana mestinya.
Analisis ini untuk API Halaman CMS tetapi juga berlaku untuk API Blok CMS .