Saya mengerti bahwa cara yang disukai untuk bekerja di antara modul di Magento 2 adalah menggunakan kontrak layanan.
Jadi, jika saya ingin memuat suatu produk, saya menggunakan gudang produk:
$product = $productRepository->getById($id);
yang dengan kontrak mengembalikan instance dari Magento\Catalog\Api\Data\ProductInterface
.
Tapi saya juga bisa menggunakan cara lama, memanggil lapisan domain secara langsung:
$product = $productFactory->create()->load($id);
Apakah ada kasus di mana ini perlu atau bermanfaat?
Devdocs mengatakan (sorot ditambahkan):
Modul dapat langsung memanggil modul lain. Solusi yang digabungkan secara ketat ini tidak direkomendasikan untuk sebagian besar situasi, tetapi terkadang tidak dapat dihindari .
[...]
Strategi Anda untuk memanggil kode lapisan-domain modul lain sangat tergantung pada konfigurasi unik dan kebutuhan sistem Anda.
Sumber: http://devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html
Dan komentar pada pertanyaan terkait menyatakan:
menggunakan Repositori akan memberi Anda model data Produk (
Api/Data/Product
), yang merupakan model Produk yang diubah menjadi DTO yang dumbed-down. Sesuatu untuk dipertimbangkan, karena mereka sangat berbeda
Tapi sejauh yang saya bisa lihat objeknya sama dalam kondisi normal, hanya tipe return per phpDoc berbeda ( Magento\Catalog\Api\Data\ProductInterface
/ Magento\Catalog\Model\Product
)
sumber
But I could also use the old way instead, calling the domain layer directly: (use factory). Is there any case where this would be necessary or useful?
. Ya: ketika Anda perlu memanggil metode model dan bukan metodeApi/Data/Product
. Ini lebih baik? :)Bagi saya, tidak ada alasan untuk menggunakan
load
metode di atasgetById
/get
metode.Saya tidak mengatakan bahwa saya benar tetapi beginilah cara saya melihat sesuatu.
Ok jadi inilah
getById
metodenya (get
metode ini serupa tetapi menggunakan sku bukan id):Karena Anda dapat melihat kode yang Anda tempel:
Merupakan bagian dari fungsi ini.
Namun, kondisi tambahan menggunakan instance yang di-cache untuk menghindari reload tambahan jika Anda sebelumnya telah menggunakan
getById
atauget
metode untuk id yang sama (atau sku dalam kasusget
metode) .Anda mungkin berpikir bahwa alasan yang baik untuk menggunakan
load
bisa untuk menghindari menggunakan contoh-contoh yang di-cache (dalam hal mana itu bisa menjadi alasan yang baik? Yang saya tidak tahu) tetapigetById
danget
metode memiliki$forceReload
parameter yang dapat diatur ke true untuk hindari menggunakan instance cache tersebut.Itu sebabnya bagi saya, tidak ada alasan bagus untuk menggunakan
load
metode overgetById
atauget
metode.sumber
Harap pahami perbedaan antara repositori dan koleksi.
Dalam contoh Anda, jika menggunakan repositori, Anda akan mendapatkan array
Magento\Catalog\Api\Data\ProductInterface
yang berbeda dari mendapatkan koleksiMagento\Catalog\Model\Product
.Repositori dan antarmuka data memberi Anda level antarmuka tinggi yang harus dijamin kompatibel di masa mendatang . Inilah sebabnya mengapa ini adalah pendekatan yang disarankan.
Semoga ini bisa membantu.
sumber