Dalam Magento 2, sebagian besar kelas memiliki dua metode konstruksi ( __construct
dan _construct
) ini. Apa perbedaan di antara mereka?
Saya tidak sepenuhnya yakin apakah itu telah berubah antara Magento 1 dan Magento 2, mungkin tidak jadi saya akan pergi dengan apa yang saya ketahui dari Magento 1.
The _construct
akan disebut setelah__construct
__construct
Metode asli PHP tidak boleh ditimpa atau digunakan dalam kode Anda. Jika Anda ingin mengeksekusi kode dengan cara yang aman pada awal penggunaan kelas _construct
.
Magento akan menggunakan yang asli __construct
untuk memastikan semuanya 'siap' untuk kelas yang akan digunakan seperti mendefinisikan tag cache yang tepat untuk model tertentu misalnya.
The _construct metode adalah "Varien penemuan" digunakan untuk membungkus beberapa logika inisialisasi dalam model, pembantu dan blok.
Jadi tidak biasa untuk mengubah atau mendeklarasikan ulang metode __construct () asli dalam Model / Blok M1 atau Pembantu karena kami selalu menggunakan pabrik Magento. Namun tidak ada masalah / praktik buruk tentang penggunaannya (jika Anda peduli kompatibilitas).
Dalam M2, metode _construct () masih ada di beberapa bagian dan digunakan untuk tujuan yang sama, tetapi sekarang (dalam M2) semua logika DI diimplementasikan oleh __constructor () sehingga Anda akan menemukan banyak deklarasi konstruk dalam basis kode.
BTW tidak ada lagi pabrik seperti Mage::getModel()
di M2.
Dengan kata lain:
Metode _construct () diimplementasikan oleh Magento di beberapa kelas dan itu disebut secara otomatis di dalam deklarasi fungsi __construct , jadi jika Anda memperluas kelas Magento seperti Model, Anda dapat menggunakannya untuk melakukan beberapa hal setelah pembuatan objek.
Dalam Model Sumber Daya atau Model Kelas Anda harus mendefinisikan _construct()
metode untuk mendefinisikan tabel dan primary_key
Di sisi lain, __construct adalah metode asli PHP (Semua bahasa OO memilikinya), __construct
dipanggil setiap kali Anda membuat instance objek. Itu saja
Contoh:
Magento \ Framework \ Model \ ResourceModel \ AbstractResource
/**
* Abstract resource model
*/
abstract class AbstractResource
{
/**
* Main constructor
*/
public function __construct()
{
/**
* Please override this one instead of overriding real __construct constructor
*/
$this->_construct();
} ...
Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb
/**
* Class constructor
*
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
* @param string $connectionName
*/
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
$this->transactionManager = $context->getTransactionManager();
$this->_resources = $context->getResources();
$this->objectRelationProcessor = $context->getObjectRelationProcessor();
if ($connectionName !== null) {
$this->connectionName = $connectionName;
}
parent::__construct();
}