Magento 2: Perbedaan antara Model dan Model Data


13

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?

Jawaban:


7

Penjelasan saya:

Sangat sulit untuk memahami perbedaan antara model dan model data. Jika saya harus mengatakan dalam beberapa kata saya bisa mengatakan bahwa model mewakili mesin dan model data mewakili informasinya .

Dalam contoh Anda, dengan entitas pelanggan, Anda dapat melihat misalnya bagaimana metode authenticateatau validatePassworddisimpan dalam model pelanggan karena mereka adalah bagian dari mesin dan mereka tidak akan langsung menangani informasi. Di sisi lain, metode seperti getExtensionAttributes, karena menangani potongan informasi disimpan dalam model data.

Saya pikir ini hanya penanganan proyek yang lebih baik, seperti pembagian antara model dan model sumber daya, Anda bisa bertanya mengapa Anda membutuhkannya juga.

Mengapa Anda membutuhkannya:

Jika Anda ingin mengekspos informasi pelanggan (misalnya) menggunakan API, Anda akan memerlukan antarmuka ( \Magento\Customer\Api\Data\CustomerInterface) dengan getter yang mendefinisikan semua atribut entitas Anda, dan jika Anda memiliki metode pengambil lain yang tidak mewakili informasi yang ingin Anda paparkan (misalnya: getRandomConfirmationKey), Anda punya masalah!

Inilah sebabnya, dalam contoh saya, getRandomConfirmationKeyadalah bagian dari model ( \Magento\Customer\Model\Customer), sedangkan getFirstnamebagian dari model data.

Aturan cepat bisa berupa:

  • Jika metode Anda mewakili kolom tabel, atribut, atau informasi entitas apa pun, maka harus masuk ke model data .
  • Jika metode Anda adalah "tindakan" pada informasi, itu menangani informasi atau Anda mendeklarasikannya di webapi.xml , maka itu harus menjadi metode model .

POS:

Dalam beberapa kata: pertimbangkan model data hampir sebagai DTO.


Semua metode di \Magento\Customer\Api\Data\CustomerInterfaceterbuka 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\Productdan\Magento\Catalog\Api\Data\ProductInterface
Milan Simek

2

Menambah jawaban @ Phoenix128_RiccardoT, yang patut diperhatikan adalah repositori (mis. MagentoCms\Api\BlockRepositoryAtau Magento\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(), dan delete()) semua ditandai sebagai deprecated. Ini karena pekerjaan itu dipindahkan ke repositori (diberikan bahwa dalam beberapa kasus semua repositori lakukan sekarang memanggil save()metode model reguler ini tetapi jalan tampaknya jelas bagi saya).


1
Bagaimana dengan model data produk. Tidak ada model data produk
sivakumar

2

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.phpmenentukan metode mana yang tersedia untuk API sedangkan Model/Customer.phpmemiliki 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.