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?

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.


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();
}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.