No Magento 2, a maioria das classes possui esses dois métodos de construção ( __construct
e _construct
). Qual a diferença entre eles?
Não tenho certeza absoluta de que tenha mudado entre o Magento 1 e o Magento 2, provavelmente não, então vou seguir o que sei do Magento 1.
O _construct
será chamado após o__construct
O __construct
método nativo do PHP não deve ser substituído ou usado no seu código. Se você deseja executar o código de maneira segura no início de uma classe, use _construct
.
O Magento usará o nativo __construct
para garantir que tudo esteja 'pronto' para que uma classe seja usada, como definir as tags de cache corretas para um determinado modelo, por exemplo.
O método _construct foi uma "invenção de Varien" usada para envolver alguma lógica de inicialização em modelos, auxiliares e blocos.
Portanto, é incomum alterar ou declarar novamente o método nativo __construct () nos modelos / blocos ou auxiliares M1, pois sempre usamos as fábricas Magento. No entanto, não há nenhum problema / prática incorreta em usá-lo (se você deseja compatibilidade).
No M2, o método _construct () ainda está presente em algumas partes e é usado para os mesmos fins, mas agora (no M2) toda a lógica DI é implementada pelo __constructor (), portanto você encontrará muitas declarações de construção na base de código.
Aliás, não há mais fábricas como Mage::getModel()
no M2.
Em outras palavras:
O método _construct () é implementado pelo Magento em algumas classes e é chamado automaticamente dentro da declaração da função __construct , portanto, se você estiver estendendo uma classe Magento como um Model, poderá usá-lo para executar algumas coisas após a criação do objeto.
Em um Modelo de Recurso ou Classe de Modelo, você deve definir um _construct()
método para definir a tabela e a chave_primária
Por outro lado, o __construct é um método nativo do PHP (todas as linguagens OO têm um), __construct
é chamado toda vez que você instancia um objeto. Isso é tudo
Exemplo:
Magento \ Framework \ Modelo \ 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 \ Modelo \ 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();
}