En Magento 2, la mayoría de las clases tienen estos dos constructos ( __constructy _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 _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.
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();
}