Apa itu __construct dan _construct di magento2?

21

Dalam Magento 2, sebagian besar kelas memiliki dua metode konstruksi ( __constructdan _construct) ini. Apa perbedaan di antara mereka?

zed Blackbeard
sumber

Jawaban:

17

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 _constructakan disebut setelah__construct

__constructMetode 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 __constructuntuk memastikan semuanya 'siap' untuk kelas yang akan digunakan seperti mendefinisikan tag cache yang tepat untuk model tertentu misalnya.

Sander Mangel
sumber
15

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), __constructdipanggil 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();
}
MauroNigrele
sumber
Bisakah Anda memberikan contoh?
zed Blackbeard
Dalam M2? saya dapat meningkatkan jawaban untuk memperjelas perbedaannya, tetapi saya tidak tahu apakah diperlukan contoh,
MauroNigrele
Saya tertarik dengan pendapat Anda tentang sesuatu yang terkait dengan DI dan __construct (). Tampaknya apa yang disebut "logika DI" di Magento2 diimplementasikan, sebagai anti-pola, karena sebenarnya menciptakan kopling ketat. Menjalankan pembaruan komposer, tergantung pada berapa banyak modul pihak 3d yang Anda perluas dengan modul Anda, sering dapat menyebabkan kebutuhan untuk debug, menambahkan params dalam konstruktor, yang tidak benar-benar digunakan di kelas anak-anak, hanya untuk menjaga aplikasi tetap berjalan. Tidak yakin bahwa itu bahkan harus disebut "Injeksi Ketergantungan", tetapi
penahanan