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 .
Jawaban:
Anda dapat membuat masalah bug di github jika mau. Tetapi cara yang lebih cepat bagi Anda adalah menggunakan model sumber daya atau jika Anda ingin menggunakan metode repositori ini deleteById () di mana Anda dapat melewatkan id entitas.
vendor / magento / module-cms / Model / PageRepository.php
Repositori bukan untuk operasi massal, ini mempengaruhi kinerja.
sumber