Che cos'è __construct e _construct in magento2?


21

In Magento 2, la maggior parte delle classi ha questi due metodi costrutti ( __constructe _construct). Qual'è la differenza tra loro?

Risposte:


17

Non sono completamente sicuro che sia cambiato tra Magento 1 e Magento 2, probabilmente no, quindi andrò con quello che so da Magento 1.

Il _constructsarà chiamato dopo il__construct

Il __constructmetodo nativo PHP non deve essere sovrascritto o utilizzato nel codice. Se si desidera eseguire il codice in modo sicuro all'inizio di una lezione, utilizzare _construct.

Magento utilizzerà il nativo __constructper assicurarsi che tutto sia "pronto" per una classe da utilizzare, come ad esempio la definizione dei tag cache giusti per un determinato modello.


15

Il metodo _construct era una "invenzione di Varien" usata per avvolgere una logica di inizializzazione in modelli, helper e blocchi.

Quindi è insolito cambiare o ri-dichiarare il metodo nativo __construct () in M1 Modelli / Blocchi o Helpers poiché usiamo sempre le fabbriche Magento. Tuttavia, non c'è alcun problema / cattiva pratica nell'usarlo (se ti interessa la compatibilità).

In M2 il metodo _construct () è ancora presente in alcune parti e viene utilizzato per gli stessi scopi, ma ora (in M2) tutta la logica DI è implementata da __constructor () in modo da trovare molte dichiarazioni di costrutti nella base di codice.

A proposito non ci sono più fabbriche come Mage::getModel()in M2.

In altre parole:

Il metodo _construct () è implementato da Magento in alcune classi e viene chiamato automaticamente all'interno della dichiarazione della funzione __construct , quindi se stai estendendo una classe Magento come un Modello puoi usarla per eseguire alcune cose dopo la creazione di oggetti.

In un modello di risorsa o in una classe di modello è necessario definire un _construct()metodo per definire la tabella e la chiave primaria

D'altra parte, __construct è un metodo nativo di PHP (tutti i linguaggi OO ne hanno uno), __constructviene chiamato ogni volta che si crea un'istanza di un oggetto. È tutto

Esempio:

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

Potete per favore fornire un esempio?
Zed Barbanera,

In M2? posso migliorare la risposta per rendere più chiara la differenza, ma non so se sia necessario un esempio,
MauroNigrele,

Sono interessato alla tua opinione su qualcosa legato a DI e __construct (). Sembra che la cosiddetta "logica DI" in Magento2 sia implementata, come anti-pattern, dal momento che in realtà crea un accoppiamento stretto. L'esecuzione di un aggiornamento del compositore, a seconda del numero di moduli di terze parti che hai esteso con i tuoi moduli, può spesso portare alla necessità di eseguire il debug, aggiungere parametri nei costruttori, che non sono realmente utilizzati nelle classi figlio, solo per mantenere l'applicazione in esecuzione. Non sono sicuro che dovrebbe anche essere chiamato "Iniezione di dipendenza", ma ancoraggio di dipendenza o qualcosa del genere ...
someGuyOnTheWeb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.