Saya memiliki cukup banyak pengalaman dengan Magento tetapi saya menyadari bahwa saya tidak mengerti cara memuat model mana yang benar dan mengapa. Saya sudah membaca semua yang saya bisa, tentang topik ini tetapi orang-orang yang menjelaskan hal-hal seperti ini tidak pernah benar-benar menjelaskan, mengapa menggunakan metode khusus ini daripada yang lain. Mari kita asumsikan tidak ada repositori untuk model yang ingin saya muat.
Sampai sekarang saya selalu menggunakan model dalam konstruktor dan kemudian hanya memuatnya.
public function __construct(
\Vendor\Module\Model\Something $somethingModel
) {
$this->somethingModel = $somethingModel;
}
public function getTestById($id) {
return $this->somethingModel->load($id);
}
Dan itu selalu berfungsi sebagaimana mestinya, saya juga cukup yakin itu atau setidaknya digunakan secara umum dalam inti.
Tapi kemudian saya melihat salah satu rekan saya menggunakan
modelFactory->create()->load($id)
Sejauh yang saya pahami pabrik digunakan untuk membuat entitas baru, misalnya, jika saya ingin membuat produk baru maka saya dapat membuat pabrik, mengisi dengan data dan menyimpannya. Tapi sekali lagi, saya mulai meneliti topik dan saya melihat contoh dari Fabian Schmengler ( Kapan Kita Harus Menggunakan Repositori dan Pabrik di Magento 2? ) Yang memuat model dengan cara ini dan juga mencegah orang lain dari hanya memuat model, dia tidak Saya tidak menjelaskan mengapa selain mengatakan bahwa itu 'bukan bagian dari kontrak layanan'. Sejauh yang saya mengerti repositori adalah bagian dari kontrak layanan, jadi saya tidak melihat koneksi di sini ketika datang ke memuat model yang tidak tersedia melalui repositori.
Untuk menambahkan lebih banyak kebingungan, saya juga telah menemukan cara memuat model dengan mendapatkan resourceModel dari menciptakan modelFactory, disajikan oleh Vinai Kopp ( Bagaimana menerapkan kontrak layanan untuk modul khusus di Magento 2? ) Dan sekarang saya benar-benar hilang karena saya selalu membaca bahwa saya tidak boleh menggunakan model sumber daya secara langsung.
Jadi ya, bisakah seseorang memberi tahu saya cara mana yang benar dan mengapa saya harus menggunakannya daripada semua metode lainnya?
Jawaban:
Nah, langkah pertama yang harus Anda periksa untuk model yang dimaksud adalah: Apakah ada Kontrak Layanan Repositori? Jika demikian, gunakan itu, karena Kontrak Layanan terikat dengan versi semantik dan akan terus berperilaku seperti seharusnya hingga Magento 3.x keluar. Tak perlu dikatakan, ketika Anda membuat modul Anda sendiri dengan model yang membutuhkan ketekunan, Anda juga harus menulis repositori untuk itu.
Jika tidak ada repositori, gunakan model sumber daya . Perhatikan bahwa model sumber daya tidak mengandung status: mereka menggunakan ketekunan untuk model 'reguler' mereka. Oleh karena itu Anda tidak diharuskan untuk menyertakan mereka menggunakan pabrik:
"Jadi, manfaat apa yang membawa Kontrak Layanan / Repositori ke Model Sumber Daya?" Anda mungkin bertanya. Nah, dalam teori, Model Sumber Daya seharusnya hanya bertanggung jawab atas kegigihan Model Data , sedangkan Repositori juga memperhitungkan tugas-tugas tambahan yang terlibat saat menyelamatkan suatu entitas. Pikirkan tentang memperbarui indeks, menciptakan hubungan dengan entitas lain, dll. Ini adalah teorinya, meskipun dalam kehidupan nyata garis-garis ini cenderung cukup kabur. Tetapi baik bagi Anda untuk mengingat hal ini.
Anda tidak harus menggunakan model langsung
save()
,load()
, dll -methods. Mereka ditinggalkan karena semantik salah. Pikirkan tentang hal ini secara SOLID:Dan poin terakhir itulah yang membuat perbedaan: ketika berkomunikasi dengan modul-modul lain, di dunia yang ideal orang tidak perlu mengandalkan logika persisten internal modul itu (atau metode publik apa pun dalam hal ini, tapi itu diskusi lain), tetapi hanya menggunakan fungsionalitas yang disediakan oleh Kontrak Servis modul .
Kesimpulannya
Untuk menjawab pertanyaan Anda: sesuai urutan pilihan. Cara yang benar untuk memuat model adalah:
sumber
Models
Data Interface digunakan untuk hanya menyimpan data dalam objek, yaitu untukset
danget
data untuk satu baris.ResourceModels
adalah mekanisme yang bertanggung jawab atas kegigihan data tersebut, yaitu mengeksekusi query SQL sebenarnyasave
atauload
data keModel
objek.Cara yang benar untuk
load
dansave
harus dengan membuat repositori atau memuat dari sumber sebagai berikut:Di sini,
\MyVendor\MyModule\Api\Data\QueueInterface
dipuji olehQueue
Model.Jadi, di belakang layar, kita sebenarnya menciptakan
Model
objek makaloading
itu olehResourceModel
objek. Ini adalah cara yang benar untuk memuat atau menyimpan.sumber