In Magento 2 haben die meisten Klassen diese beiden Konstruktionsmethoden ( __construct
und _construct
). Was ist der Unterschied zwischen ihnen?
Ich bin mir nicht ganz sicher, ob es sich zwischen Magento 1 und Magento 2 geändert hat, wahrscheinlich auch nicht, also werde ich mit dem arbeiten, was ich von Magento 1 kenne.
Der _construct
wird nach dem angerufen__construct
Die native PHP- __construct
Methode sollte nicht überschrieben oder in Ihrem Code verwendet werden. Wenn Sie zu Beginn einer Klasse Code auf sichere Weise ausführen möchten, verwenden Sie _construct
.
Magento verwendet den nativen Code __construct
, um sicherzustellen, dass alles für die Verwendung einer Klasse bereit ist, z. B. um die richtigen Cache-Tags für ein bestimmtes Modell zu definieren.
Die _construct- Methode war eine "Varien-Erfindung" , mit der einige Initialisierungslogiken in Modelle, Helfer und Blöcke eingebunden wurden .
Daher ist es ungewöhnlich, die native __construct () -Methode in M1-Modellen / -Blöcken oder -Helfern zu ändern oder neu zu deklarieren, da wir immer die Magento-Fabriken verwenden. Es ist jedoch kein Problem / keine schlechte Praxis, es zu verwenden (wenn Sie auf Kompatibilität achten).
In M2 ist die _construct () -Methode in einigen Teilen noch vorhanden und wird für dieselben Zwecke verwendet, aber jetzt (in M2) wird die gesamte DI-Logik vom __constructor () implementiert, sodass Sie viele Konstruktdeklarationen in der Codebasis finden.
Übrigens gibt es keine Fabriken mehr wie Mage::getModel()
in M2.
Mit anderen Worten:
Die _construct () -Methode wird von Magento in einigen Klassen implementiert und in der __construct- Funktionsdeklaration automatisch aufgerufen. Wenn Sie also eine Magento-Klasse wie ein Modell erweitern, können Sie damit nach der Objekterstellung einige Aufgaben ausführen.
In einem Ressourcenmodell oder einer _construct()
Modellklasse sollten Sie eine Methode definieren, um die Tabelle und den Primärschlüssel zu definieren
Andererseits ist das __construct eine native PHP-Methode (alle OO-Sprachen haben eine), __construct
die jedes Mal aufgerufen wird, wenn Sie ein Objekt instanziieren. Das ist alles
Beispiel:
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();
}