Cursos Magento

Dependency Injection: entenda como funciona

,

17 de abril de 2018

Dependency Injection ou Injeção de dependência, é uma das grandes mudanças do Magento 2 e afeta diretamente a forma como criávamos módulos no Magento 1.

Como o nome sugere é através desta técnica que podemos adicionar novas dependências a uma classe. Enquanto no Magento 1 nós estendíamos a classe que nosso módulo necessitava, no Magento 2 todas as classes que queremos utilizar podem ser passadas no construtor da classe por exemplo. Por sua vez, o Magento buscará as classes em seus devidos lugares.

Imagine que você criou uma nova classe no Magento e esta classe busca dados em um outro Helper (outra classe). Portanto ela dependerá deste helper em algum ponto. Se estivéssemos desenvolvendo para Magento 1, bastaria chamar nosso helper com Mage::helper em qualquer lugar.

No entanto, no Magento 2, devemos primeiro buscar as classes e objetos que vamos usar em nossa classe. E isso faz muito sentido, não é mesmo? Antes de construir a casa, precisamos desenhar a planta, e conseguir o material para construção.

Veja o exemplo de injeção de dependência abaixo:

Note que nas linhas 9 e 10 as classes Magento\Backend\Model\Menu\Item\Factor e Magento\Backend\Model\Menu são injetadas na classe, e em seguida associadas e disponibilizadas nas propriedades _itemFactory e _menu.

As classes serão automaticamente inseridas pelo ObjectManager no começo do processo de carregamento do Magento.

Este é o tipo de injeção de dependência mais comum e mais utilizado, que é chamado Injeção de Construtor.

No entanto, existem outros 2 tipos de injeção de dependências no Magento. Vamos revisar os 3 tipos:

  • Injeção de Construtor (Constructor Injection): o mais comum e mais usado no Magento, como vimos acima. Para usá-lo basta adicionar a classe ou dependência que queremos no construtor da classe.
  • Setter Injection: Neste caso apenas adicionamos um setter na classe que recebe uma dependência.
  • Injeção via Inteface (Interface Injection): usa classes do tipo Interface para fazer injeção de dependências.

 

Brincando com Dependency Injection

Quando digitamos bin/magento no console, temos uma lista de comandos disponíveis. Para fins de teste e didáticos sempre crio um novo comando para testar algo ou mesmo demonstrar alguma coisa.

A lista de comandos disponíveis é montada através de injeção de dependência via interface. Portanto, para adicionar um novo comando à lista, precisamos realizar uma injeção de dependência.

Criando um comando no bin/magento

Assumindo que você já criou um módulo base Magento 2, vamos adicionar o seguinte arquivo em nosso módulo:

Em seguida, vamos adicionar um arquivo em etc/di.xml e injetar esta classe no array commands da classe Magento\Framework\Console\CommandListInterface:

Se você abrir a classe Magento\Framework\Console\CommandListInterface, ficará fácil descobrir qual dos 3 tipos de Injection estamos usando aqui, não é mesmo?

Com isso já podemos chamar nosso comando no terminal.

Dependency Injection de Construtor

Vamos supor que nossa classe agora precise da classe \Magento\Framework\Filter\FilterManager para alguma coisa.
Basta adicionar a chamada dela a um método __construct. Ficaria assim:

Desta vez eu não preciso sequer mexer no di.xml, e já posso sair usando minha classe.

Substituindo classe usando Dependency Injection: a beleza começa aqui

Note que a classe que passamos para o nosso construtor é \Magento\Framework\Filter\FilterManager.
Se você adicionar um simples get_class($this->filterManager) na saída, poderá ver a classe que está sendo instanciada. Vejamos:

classe antes da injeção da dependency injection

Substituindo a dependência

Vamos supor que queremos substituir a classe acima por outra, pois este é um módulo do core do Magento, ou um módulo de terceiro.
Para isso, criarei um outro módulo, aqui chamado Magenteiro_Di. Nele criarei uma classe chamada FilterManager.php e um arquivo di.xml que dirá ao Magento para substituir o parâmetro $filterManager pela minha classe.

Note que na linha 4 eu especifico o nome do argumento (variável) que eu quero substituir, passando o novo objeto como parâmetro.
Veja o que acontece antes e depois de habilitar meu novo módulo.

Não é bacana? Isso é só o começo.

Se desejar receber os arquivos dos módulos acima, ficar por dentro das novidades do Magenteiro e ainda ser o primeiro a ter acesso ao curso de Magento 2, preencha o formulário abaixo.

Imagem principal de Pixabay.

 

Ricardo Martins

Desenvolvedor web há mais de 15 anos, desde 2011 totalmente especializado em Magento, ajudo na criação de conteúdo, e cursos online sobre Magento - hoje com mais de 7000 alunos de 97 países - e criador do módulo PagSeguro Transparente para Magento, usado em mais de 12 mil lojas.

Últimos posts por Ricardo Martins (exibir todos)

Comentários