O que é Dependency Injection?

Dependency Injection, ou simplesmente DI, é um design pattern que permite que uma classe A declare uma dependência externa de uma classe B que supra essa dependência. Normalmente, as dependências declaradas pela classe A são interfaces, enquanto a classe B provê a implementação concreta desta interface.
Isto permite uma fraca acoplagem de código, já que o objeto A não tem mais a responsabilidade de instanciar as suas próprias dependências. O objeto B, por sua vez, decide qual é a implementação concreta que deve ser injetada no objeto A baseado em configurações.
Mas aí você pode estar se perguntando…  Como eu faço então para para usar o objeto B dentro da classe A no Magento 2? Nós, da MagedIn, vamos explicar isto para você!!
No Magento 1, por exemplo, a própria classe A era responsável por obter os objetos/classes necessárias para o funcionamento do código. Ela fazia isso através da classe Mage. Por exemplo, para se obter o model de um produto, era necessário usar o comando Mage::getModel(‘catalog/product) e assim por diante…. No Magento 2, isto não é mais assim! Não existe mais uma God class ‘Mage’.
O Magento 2 segue o ‘Princípio de Responsabilidade Única’ (SRP), o qual diz que cada classe deve ter uma única responsabilidade. Ou seja, se uma classe possui a responsabilidade de fazer o cálculo de um total e também de instanciar as suas dependências, você está quebrando esse princípio de responsabilidade única.
O Dependency Injection veio para acabar com este problema de dependência. Ela é uma nova camada, a qual não existia no Magento 1, cuja responsabilidade é criar as dependências/subdependências das classes de forma recursiva/encadeada. Com isso, o Magento implementa o conceito de DI de uma maneira muito forte.
Todas as dependências no Magento 2 são declaradas no método construtor (__construct) de cada classe. Com isso, o DI trabalha para ler, criar e injetar todas as dependências especificadas no contrutor da classe, tornando possível o uso destas dependências dentro da mesma. Desta forma, com várias classes sendo injetadas e compondo a classe, o conceito de composição acima de herança também é aplicado no M2.
Vamos a um exemplo básico para exemplificar o que falamos…

Sem DI (no Magento 1):

<?php

class MagedIn_TestModule_Helper_Data 
{

   private $password;
   
   public function setPassword($newPassword)
   {
      $passwordValidator = Mage::helper('magedin_validator/passwordValidator);
      $passwordValidator->validate($newPassword);
      $this->password = $newPassword;
   }

}

Com DI (no Magento 2):

<?php 

namespace MagedIn\TestModule\Helper; 

use MagedIn\Validator\Helper\PasswordValidator; 

class Data 
{ 

   private $passwordValidator; 
   
   private $password; 

   public function __construct(PasswordValidator $validator) 
   { 
      $this->passwordValidator = $validator;
   }

   public function setPassword(string $newPassword): void
   {
      $this->passwordValidator->validate($newPassword);
      $this->password = $newPassword;
   }

}

Entendeu? Se ficou com qualquer dúvida, fique tranquilo que no próximo artigo da série sobre DI daremos mais exemplos sobre o uso do DI no Magento 2.

Confira o conteúdo desse artigo em nossa vídeo aula:

Este vídeo faz parte do nosso curso gratuito de Magento 2 que lançamos recentemente.

Confira também os outros artigos desta série:

Dependency Injection no Magento 2 – Parte 1

– Equipe MagedIn University

Inscreva-se também no nosso canal do YouTube.