O que é __construct e _construct no magento2?

21

No Magento 2, a maioria das classes possui esses dois métodos de construção ( __constructe _construct). Qual a diferença entre eles?

zed Barba Negra
fonte

Respostas:

17

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 _constructserá chamado após o__construct

O __constructmé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 __constructpara garantir que tudo esteja 'pronto' para que uma classe seja usada, como definir as tags de cache corretas para um determinado modelo, por exemplo.

Sander Mangel
fonte
15

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();
}
MauroNigrele
fonte
Você pode fornecer um exemplo?
Zed Blackbeard
Em M2? Eu posso melhorar a resposta para deixar mais clara a diferença, mas não sei se é necessário um exemplo.
MauroNigrele
Estou interessado em sua opinião sobre algo relacionado a DI e __construct (). Parece que a chamada "lógica DI" no Magento2 é implementada, como antipadrão, já que na verdade cria acoplamento rígido. A execução de uma atualização do compositor, dependente do número de módulos de festa em 3D que você estendeu com seus módulos, pode levar à necessidade de depurar, adicionar parâmetros nos construtores, que não são realmente usados ​​nas classes filho, apenas para manter o aplicativo em execução. Não tenho certeza de que ele deva ser chamado de "Injeção de Dependência", mas de dependência de ancoragem ou algo assim ...
someGuyOnTheWeb