Qu'est-ce que __construct et _construct dans magento2?

21

Dans Magento 2, la plupart des classes ont ces deux méthodes de construction ( __constructet _construct). Quelle est la différence entre eux?

zed Blackbeard
la source

Réponses:

17

Je ne suis pas complètement sûr si cela a changé entre Magento 1 et Magento 2, probablement pas, donc je vais continuer avec ce que je sais de Magento 1.

Le _constructsera appelé après le__construct

La __constructméthode native PHP ne doit pas être écrasée ou utilisée dans votre code. Si vous souhaitez exécuter du code de manière sûre au début d'une classe, utilisez _construct.

Magento utilisera le natif __constructpour s'assurer que tout est «prêt» pour une classe à utiliser, comme la définition des bonnes balises de cache pour un certain modèle par exemple.

Sander Mangel
la source
15

La méthode _construct était une "invention de Varien" utilisée pour encapsuler une logique d'initialisation dans des modèles, des assistants et des blocs.

Il est donc inhabituel de modifier ou de re-déclarer la méthode native __construct () dans les modèles / blocs M1 ou les assistants, car nous utilisons toujours les usines Magento. Cependant, il n'y a aucun problème / mauvaise pratique à l'utiliser (si vous vous souciez de la compatibilité).

Dans M2, la méthode _construct () est toujours présente dans certaines parties et est utilisée aux mêmes fins, mais maintenant (dans M2) toute la logique DI est implémentée par le __constructor (), vous trouverez donc beaucoup de déclarations de construction dans la base de code.

BTW il n'y a plus d'usines comme Mage::getModel()au M2.

En d'autres termes:

La méthode _construct () est implémentée par Magento dans certaines classes et elle est appelée automatiquement dans la déclaration de fonction __construct , donc si vous étendez une classe Magento comme un modèle, vous pouvez l'utiliser pour effectuer des tâches après la création d'objet.

Dans un modèle de ressource ou une classe de modèle, vous devez définir une _construct()méthode afin de définir la table et la clé_principale

En revanche, le __construct est une méthode native de PHP (tous les langages OO en ont un), __constructest appelé chaque fois que vous instanciez un objet. C'est tout

Exemple:

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
la source
Pouvez-vous donner un exemple?
zed Blackbeard
En M2? je peux améliorer la réponse afin de faire plus de différence, mais je ne sais pas si un exemple est nécessaire,
MauroNigrele
Je suis intéressé par votre avis sur quelque chose en rapport avec DI et __construct (). Il semble que la soi-disant "logique DI" dans Magento2 soit implémentée, comme anti-modèle, car elle crée en fait un couplage étroit. L'exécution d'une mise à jour du compositeur, en fonction du nombre de modules tiers que vous avez étendus avec vos modules, peut souvent entraîner le débogage, l'ajout de paramètres dans les constructeurs, qui ne sont pas vraiment utilisés dans les classes enfants, juste pour maintenir l'application en cours d'exécution. Pas sûr que cela devrait même être appelé une "injection de dépendance", mais l'ancrage des dépendances ou quelque chose ...
someGuyOnTheWeb