Was ist __construct und _construct in magento2?

21

In Magento 2 haben die meisten Klassen diese beiden Konstruktionsmethoden ( __constructund _construct). Was ist der Unterschied zwischen ihnen?

zed Blackbeard
quelle

Antworten:

17

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 _constructwird nach dem angerufen__construct

Die native PHP- __constructMethode 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.

Sander Mangel
quelle
15

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), __constructdie 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();
}
MauroNigrele
quelle
Können Sie bitte ein Beispiel geben?
Zed Blackbeard
In M2? Ich kann die Antwort verbessern, um den Unterschied klarer zu machen, aber ich weiß nicht, ob ein Beispiel benötigt wird,
MauroNigrele
Ihre Meinung zu DI und __construct () interessiert mich. Scheint, dass die sogenannte "DI-Logik" in Magento2 als Anti-Pattern implementiert ist, da sie tatsächlich eine enge Kopplung erzeugt. Das Ausführen eines Composer-Updates, abhängig von der Anzahl der 3D-Party-Module, die Sie mit Ihren Modulen erweitert haben, kann häufig dazu führen, dass Sie das Debuggen und Hinzufügen von Parametern in Konstruktoren, die in den untergeordneten Klassen nicht wirklich verwendet werden, erforderlich machen, um die Anwendung am Laufen zu halten. Nicht sicher, ob es überhaupt eine "Abhängigkeitsinjektion" genannt werden sollte, sondern Abhängigkeitsverankerung oder so ...
someGuyOnTheWeb