En Magento 2, la mayoría de las clases tienen estos dos constructos ( __construct
y _construct
) métodos. ¿Cuál es la diferencia entre ellos?
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 _construct
será llamado después del__construct
El __construct
mé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 __construct
para 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.
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), __construct
se 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();
}