Saya sadar bahwa Magento 2 memperkenalkan model data sebagai bagian dari arsitektur kontrak layanan. Model data biasanya mengimplementasikan antarmuka yang didefinisikan dalam Api / Data / modul.
Tapi, Magento tampaknya tetap mempertahankan model lama juga.
Mari kita ambil contoh untuk pelanggan modul.
- Antarmuka model data didefinisikan dalam Api / Data / CustomerInterface.php
- Antarmuka di atas diimplementasikan dalam Model / Data / Customer.php
- Model data memiliki semua fungsi pengambil dan penyetel untuk variabel pelanggan, seperti yang diharapkan
- Selain di atas ada juga Model / Pelanggan.php. Ini juga memiliki fungsi pengambil dan penyetel. Ini lebih seperti model Magento 1 yang terhubung ke ResourceModel (Model / ResourceModel / Customer.php)
- Dalam Model / ResourceModel / CustomerRepository.php, berbagai fungsi mengumpulkan data dari model Magnento 1, mentransfernya ke model data, dan kemudian mengembalikan model data.
Mengapa orang membutuhkan model lama? Mengapa model data tidak dapat terhubung langsung dengan ResourceModel?
sumber
\Magento\Customer\Api\Data\CustomerInterface
terbuka untuk REST / SOAP API (jika diaktifkan). Namun, Anda tidak memerlukan model data untuk memilih metode mana yang terbuka, karena Anda cukup menghubungkan antarmuka ke model 'nyata'. Begitulah cara melakukannya\Magento\Catalog\Model\Product
dan\Magento\Catalog\Api\Data\ProductInterface
Menambah jawaban @ Phoenix128_RiccardoT, yang patut diperhatikan adalah repositori (mis.
MagentoCms\Api\BlockRepository
AtauMagento\Customer\Api\CustomerRepositoryInterface
) juga berharap Anda akan memberikan model data dan bukan yang biasa. Model data adalah lapisan abstraksi atas model standar yang memaparkan hanya data yang disediakan oleh entitas. Semua "tindakan" atas data ini dipindahkan ke tempat lain.Tampaknya sedikit seperti gagasan entitas di Symfony2 dan Symfony3 di mana entitas hanya berisi data dan manipulasi data apa pun terjadi di manajer entitas. Di Magento2 peran ini, saya percaya, diberikan kepada repositori.
Model lama masih bersama kita karena cara Magento2 dikembangkan. Mereka jelas tidak memulai dari blank index.php tetapi menggunakan kembali beberapa kode dari M1. Ketika Anda melihat pada metode model standar (
load()
,save()
, dandelete()
) semua ditandai sebagaideprecated
. Ini karena pekerjaan itu dipindahkan ke repositori (diberikan bahwa dalam beberapa kasus semua repositori lakukan sekarang memanggilsave()
metode model reguler ini tetapi jalan tampaknya jelas bagi saya).sumber
Model merangkum logika bisnis independen penyimpanan, mereka tidak tahu tentang mesin basis data atau contoh, dalam Magento 2 Model Data adalah Obyek Transfer Data (DTO), implementasi antarmuka khusus DTO (model data) untuk model CRM Magento (model ) menentukan metode kelas mana yang tersedia melalui Magento WebAPI.
Model/Data/Customer.php
menentukan metode mana yang tersedia untuk API sedangkanModel/Customer.php
memiliki warisan Magento 1 jenis implementasi getter kustom dan setter tersedia untuk operasi non API.Model/ResourceModel/CustomerRepository.php
adalah bagian dari fitur baru yang diperkenalkan di Magento 2 - Kontrak Layanan, ia bekerja dengan kombinasi DTO (Model Data).Seperti yang kita ketahui bahwa Magento ORM terdiri dari Model, Model Sumber Daya dan Koleksi dan tergantung pada Basis Data, tujuan Kontrak Layanan adalah untuk menyembunyikan logika penyimpanan sehingga klien yang terhubung ke Repositori (Kontrak Layanan) tidak peduli dengan penyimpanan target. mesin.
sumber