Karena sulit bagi saya untuk menemukan jalan yang benar, di bawah ini Anda dapat menemukan praktik terbaik yang saya buat menjadi milik saya. Nikmati, perbaiki bahasa Inggris saya jika perlu dan katakan saya salah jika saya salah. :)
Sunting: ... dan saya tahu saya salah dalam beberapa aspek. Jadi saya memperbarui posting asli setelah jawaban Raphael membantu saya untuk lebih mengerti. Berkat dia !
Konsep yang digunakan di bawah ini :
Akan lebih mudah bagi Anda untuk memahami kode dan penjelasan di bawah ini jika Anda merasa nyaman dengan konsep-konsep ini:
- Ketergantungan Injeksi (karena setiap
$this->variable
variabel dalam kode disuntikkan) - Kontrak dan Repositori Layanan
- Pabrik
Konteks :
Hanya untuk memiliki lebih banyak konteks, bayangkan kita memiliki modul yang dibangun dengan:
- kelas blok CustomBlock yang berisi metode
getCustomModel($id)
, - metode ini mengembalikan objek CustomModel berdasarkan id yang dilewatkan di param,
- Jenis CustomModel sesuai dengan model di
\Vendor\Module\Model\CustomModel
- Model ini dilengkapi dengan model sumber dayanya (dalam
\Vendor\Module\Model\ResourceModel\CustomModel
) - dan dengan repositori-nya
\Vendor\Module\Model\CustomModelRepository
.
Pertanyaan :
- Apa praktik terbaik untuk membiarkan semuanya memuat objek CustomModel?
Anda tidak dapat menggunakan load()
dari objek CustomModel karena metode ini sudah usang.
Praktik yang baik mengatakan bahwa Anda harus menggunakan Kontrak Layanan CustomModel. Kontrak layanan adalah antarmuka data (mis. CustomModelInterface) dan antarmuka layanan (mis. CustomModelRepositoryInterface). Jadi blok saya terlihat seperti ini:
/ ** @var SlideRepositoryInterface * / protected $ slideRepository; / ** * Konstruktor CustomBlock * ... * @param CustomModelRepositoryInterface $ customModelRepository * ... * / fungsi publik __construct ( ... CustomModelRepositoryInterface $ customModelRepository ... ) { $ this-> customModelRepository = $ customModelRepository; } fungsi publik getCustomModel ($ id) { return $ this-> customModelRepository-> get ($ id); }
Pertama-tama, kita menyuntikkan CustomModelRepositoryInterface
objek ke dalam konstruktor dan kita menggunakannya dalam getCustomModel()
metode kita .
Di kelas Api\CustomModelRepositoryInterface
tidak banyak. Umumnya (tapi tidak mencegah Anda lakukan secara berbeda) Anda akan mendeklarasikan metode dasar: get
, getList
, save
, delete
, deleteById
. Untuk tujuan topik ini, di bawah ini hanya get
deklarasi metode:
/**
* Get info by id
*
* @param int $id
* @return Data\CustomModelInterface
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function get($id);
Oke, tetapi jika CustomModel Interface saya dipanggil dengan injeksi dependensi di konstruktor blok saya, di mana kodenya? Untuk menjawab pertanyaan ini, Anda harus menjelaskan kepada Magento di mana menemukan kelas yang mengimplementasikan antarmuka ini. Dalam file etc / di.xml modul, Anda harus menambahkan:
<preference for="Vendor\Module\Api\CustomModelRepositoryInterface" type="Vendor\Module\Model\CustomModelRepository" />
Jadi CustomModelRepositoryInterface
kelas adalah antarmuka layanan. Dalam mengimplementasikannya Anda harus mengimplementasikan juga antarmuka data (setidaknya Vendor\Module\Api\Data\CustomModelInterface
dan Vendor\Module\Api\Data\CustomModelSearchResultsInterface
). Model Anda harus mengimplementasikan Vendor\Module\Api\Data\CustomModelInterface
dan menambahkan <preference ... />
baris untuk masing-masing antarmuka Anda. Akhirnya kapan saja Anda menggunakan kontrak layanan, pikirkan mySomethingInterface
tidak lagi di mySomething
: biarkan magento menggunakan di.xml
mekanisme preferensi.
Ok, apa yang terjadi selanjutnya? Saat kami menyuntikkan CustomModelRepositoryInterface
di blok konstruktor, kami mendapatkan CustomModelRepository
objek. CustomModelRepository
harus mengimplementasikan metode yang dinyatakan dalam CustomModelRepositoryInterface
. Jadi kita punya ini di Vendor\Module\Model\CustomModelRepository
:
fungsi publik dapatkan ($ id) { $ customModel = $ this-> customModelFactory-> create (); $ customModel-> load ($ id); if (! $ customModel-> getId ()) { melempar NoSuchEntityException baru (__ ('CustomModel dengan id "% 1" tidak ada.', $ id)); } mengembalikan $ customModel; }
Apa yang kita lakukan Kami membuat CustomModel
objek kosong berkat pabrik. Selanjutnya kita memuat data dalam CustomModel
menggunakan metode model beban. Selanjutnya kita mengembalikan a NoSuchEntityException
jika kita gagal memuat CustomModel
dengan id dalam params. Tetapi jika semuanya baik-baik saja, kami mengembalikan objek model dan kehidupan terus berlanjut.
Tapi wow ...! Dalam contoh ini apa itu?
$customModel->load($id);
Bukankah load
metode usang yang sama dari pada awalnya? Ya itu. Saya pikir ini memalukan, tetapi Anda harus menggunakannya karena dalam metode load () ini ada beberapa acara yang dikirimkan dan pengembang dapat mendengarkannya (lihat jawaban Raphael di bawah).
Di masa depan, kita akan diselamatkan oleh Entity Manager. Ini cerita lain sebagai konsep Magento 2 yang baru, tetapi jika Anda ingin mengetahuinya, Entity Manager sudah diterapkan dalam Resource Model CMS Page (v2.1):
public function load(AbstractModel $object, $value, $field = null)
{
$pageId = $this->getPageId($object, $value, $field);
if ($pageId) {
$this->entityManager->load($object, $pageId);
}
return $this;
}
sumber
load()
. Resource Model menyebut metode model dari metode sendiriload()
:$model->beforeLoad() { $this->_beforeLoad() }
dan$model->afterLoad() { $this->_afterLoad() }
Saya pikir pernyataan berikut ini tidak valid sekarang.
kita dapat menemukan
Magento\Framework\EntityManager\Observer
folder semua acara.sumber