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->variablevariabel 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 CustomModelRepositoryInterfaceobjek ke dalam konstruktor dan kita menggunakannya dalam getCustomModel()metode kita .
Di kelas Api\CustomModelRepositoryInterfacetidak 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 getdeklarasi 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 CustomModelRepositoryInterfacekelas adalah antarmuka layanan. Dalam mengimplementasikannya Anda harus mengimplementasikan juga antarmuka data (setidaknya Vendor\Module\Api\Data\CustomModelInterfacedan Vendor\Module\Api\Data\CustomModelSearchResultsInterface). Model Anda harus mengimplementasikan Vendor\Module\Api\Data\CustomModelInterfacedan menambahkan <preference ... />baris untuk masing-masing antarmuka Anda. Akhirnya kapan saja Anda menggunakan kontrak layanan, pikirkan mySomethingInterfacetidak lagi di mySomething: biarkan magento menggunakan di.xmlmekanisme preferensi.
Ok, apa yang terjadi selanjutnya? Saat kami menyuntikkan CustomModelRepositoryInterfacedi blok konstruktor, kami mendapatkan CustomModelRepositoryobjek. CustomModelRepositoryharus 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 CustomModelobjek kosong berkat pabrik. Selanjutnya kita memuat data dalam CustomModelmenggunakan metode model beban. Selanjutnya kita mengembalikan a NoSuchEntityExceptionjika kita gagal memuat CustomModeldengan 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 loadmetode 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;
}