¿Qué es __construct y _construct en magento2?

21

En Magento 2, la mayoría de las clases tienen estos dos constructos ( __constructy _construct) métodos. ¿Cuál es la diferencia entre ellos?

zed Blackbeard
fuente

Respuestas:

17

No estoy completamente seguro de si ha cambiado entre Magento 1 y Magento 2, probablemente no, así que voy a ir con lo que sé de Magento 1.

El _constructserá llamado después del__construct

El __constructmétodo nativo de PHP no debe sobrescribirse ni usarse en su código. Si desea ejecutar el código de manera segura al inicio de una clase, use _construct.

Magento usará el nativo __constructpara asegurarse de que todo esté 'listo' para que se use una clase, como la definición de las etiquetas de caché correctas para un determinado modelo, por ejemplo.

Sander Mangel
fuente
15

El método _construct fue un "invento de Varien" usado para envolver cierta lógica de inicialización en modelos, ayudantes y bloques.

Por lo tanto, es inusual cambiar o volver a declarar el método nativo __construct () en M1 Modelos / Bloques o Ayudantes, ya que siempre usamos las fábricas de Magento. Sin embargo, no hay ningún problema / mala práctica sobre su uso (si le importa la compatibilidad).

En M2, el método _construct () todavía está presente en algunas partes y se usa para los mismos propósitos, pero ahora (en M2) toda la lógica DI es implementada por __constructor (), por lo que encontrará muchas declaraciones de construcción en la base del código.

Por cierto, no hay más fábricas como Mage::getModel()en M2.

En otras palabras:

El método _construct () es implementado por Magento en algunas clases y se llama automáticamente dentro de la declaración de la función __construct , por lo que si está extendiendo una clase Magento como un Modelo, puede usarlo para realizar algunas cosas después de la creación del objeto.

En un modelo de recurso o clase de modelo, debe definir un _construct()método para definir la tabla y la clave_primaria

Por otro lado, __construct es un método nativo de PHP (todos los lenguajes OO tienen uno), __constructse llama cada vez que crea una instancia de un objeto. Eso es todo

Ejemplo:

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
fuente
¿Puedes dar un ejemplo?
zed Blackbeard
En M2? puedo mejorar la respuesta para aclarar la diferencia, pero no sé si se necesita un ejemplo,
MauroNigrele
Estoy interesado en su opinión sobre algo relacionado con DI y __construct (). Parece que la llamada "lógica DI" en Magento2 se implementa como antipatrón, ya que en realidad crea un acoplamiento estrecho. Ejecutar una actualización de compositor, dependiendo de cuántos módulos de fiesta en 3D haya extendido con sus módulos, a menudo puede llevar a la necesidad de depurar, agregar parámetros en constructores, que realmente no se usan en las clases secundarias, solo para mantener la aplicación en funcionamiento. No estoy seguro de que incluso deba llamarse "inyección de dependencia", sino anclaje de dependencia o algo así ...
someGuyOnTheWeb