Magento2'de __construct ve _construct nedir?


21

Magento 2'de, sınıfların çoğu bu iki yapı ( __constructve _construct) yöntemine sahiptir. Onların arasındaki fark ne?

Yanıtlar:


17

Magento 1 ve Magento 2 arasında değişip değişmediğinden tam olarak emin değilim, muhtemelen öyle değil, Magento 1'den bildiklerimle gideceğim.

_constructSonra adı verilecek__construct

PHP yerel __constructyönteminin üzerine yazılmamalı veya kodunuzda kullanılmamalıdır. Sınıf kullanımının başında kodu güvenli bir şekilde yürütmek istiyorsanız _construct.

Magento, __constructörneğin belirli bir model için doğru önbellek etiketlerini tanımlamak gibi bir sınıfın kullanılabilmesi için her şeyin 'hazır' olduğundan emin olmak için yerel dili kullanacaktır .


15

_Construct yöntemi olarak "Varien buluş," modelleri, yardımcıları ve blok bazı başlatma mantık sarmak için kullanılan.

Her zaman Magento fabrikalarını kullandığımız için M1 Modelleri / Blokları veya Yardımcılarında yerel __construct () yöntemini değiştirmek veya yeniden bildirmek olağandışı bir durumdur . Bununla birlikte, kullanımıyla ilgili herhangi bir sorun / kötü uygulama değildir (uyumluluğa önem veriyorsanız).

M2 ise _construct () hala bazı yerlerinde bulunan ve aynı amaçlar için kullanılır, ama şimdi kod tabanı yapı bildirimleri bir sürü bulacaksınız bu yüzden tüm DI mantık __constructor () tarafından yürütülmektedir (M2) yöntemi.

BTW M2'de olduğu gibi fabrika yok Mage::getModel().

Diğer bir deyişle:

_Construct () metodu bazı sınıflarda Magento tarafından uygulanan ve içinde otomatik denir __construct size nesne oluşturulduktan sonra bazı şeyler gerçekleştirmek için kullanabileceğiniz bir model gibi Magento sınıfını genişleten eğer öyleyse, işlev bildirimi.

Kaynak Modeli veya Model Sınıfında _construct(), tabloyu ve birincil_anahtarı tanımlamak için bir yöntem tanımlamanız gerekir

Öte yandan ise __construct bir olan yerli , PHP (Tüm OO dilleri birine sahip) yöntemi __construct, bir nesnenin örneğini her zaman denir. Bu kadar

Misal:

Magento \ Framework \ Modeli \ 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 \ Modeli \ 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();
}

Lütfen örnek verebilir misiniz?
zed Karasakal

M2'de mi? farkı daha net hale getirmek için cevabı geliştirebilirim, ancak bir örneğin gerekli olup olmadığını bilmiyorum,
MauroNigrele

DI ve __construct () ile ilgili bir şey hakkındaki görüşlerinizle ilgileniyorum. Magento2'deki sözde "DI mantığı" nın anti-desen olarak uygulandığını, çünkü sıkı bir bağlantı oluşturduğunu söylüyor. Modüllerinizle kaç tane 3B parti modülünüzü genişlettiğinize bağlı olarak bir besteci güncellemesi çalıştırmak, yalnızca uygulamayı çalışmaya devam etmek için çocuk sınıflarında gerçekten kullanılmayan hata ayıklama, parametre ekleme işlemlerine neden olabilir. Hatta bir "Bağımlılık Enjeksiyonu" olarak adlandırılması gerekir, ama bağımlılık demirleme ya da bir şey ...
someGuyOnTheWeb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.