O Magento 2 usa Dependency Injection para substituir a funcionalidade fornecida pela classe Mage
no Magento 1.x.
Dependency injection é um design pattern que permite que um objeto A declare suas dependências a um objeto externo B que fornece essas dependências. As dependências declaradas por A geralmente são interfaces de classe e as dependências que B fornece são as implementações concretas para essas interfaces.
Isso permite um acoplamento flexível do código, porque o objeto A não precisa mais se preocupar com a inicialização de suas próprias dependências. O objeto B decide quais implementações fornecer ao objeto A com base em uma configuração ou comportamento desejado.
Este é um conceito importante a ser entendido pelos desenvolvedores de extensões, porque forma a base de como o Magento compõe suas classes.
Princípio da Inversão de Dependência
Siga o princípio de inversão de dependência e use abstrações em seu código para reduzir as dependências de código. Isso significa que suas classes de alto nível devem usar as interfaces de classes de baixo nível em vez de trabalhar diretamente com elas.
Usar interfaces no seu código reduz o risco de erros de incompatibilidade quando o Magento altera a implementação subjacente dessas interfaces. Ele também permite que você se concentre no que uma classe faz em vez de como ela é implementada.
Uma vez que a base de código Magento segue este princípio, você pode mapear sua própria implementação de uma interface Magento para uma classe ou serviço dependente usando o arquivo di.xml
.
Object Manager
O ObjectManager é uma classe de serviço Magento que instancia objetos no início do processo de bootstrapping.
O Magento usa assinaturas de construtor de classe para recuperar informações sobre as dependências do construtor de um objeto. Quando uma classe é construída, o Object Manager injeta as dependências da classe, definidas no di.xml
, no construtor da classe.
Como o Object Manager fornece seu serviço indiretamente, sua classe não deve depender do próprio objeto do ObjectManager. As únicas exceções são factories personalizadas com lógica complexa e testes de integração que precisam de configuração do ambiente.
Compilando Dependências
O Magento usa sua ferramenta de compilador de código para coletar todas as informações de dependência de classe e armazená-las em arquivos. Durante o processo de criação de classes, o gerenciador de objetos usa essas informações para criar objetos concretos no aplicativo.
As classes de serviço que não existem na base de código, como proxies, factories e interceptors que são declarados no código ou em uma configuração, são geradas com a ajuda do compilador.
Tipos de injeção usados no Magento
O exemplo de código a seguir destaca os dois tipos de injeção de dependência usados no Magento:
namespace Magento\Backend\Model\Menu; class Builder { /** * @param \Magento\Backend\Model\Menu\Item\Factory $menuItemFactory */ public function __construct( Magento\Backend\Model\Menu\Item\Factory $menuItemFactory, // Service dependency ) { $this->_itemFactory = $menuItemFactory; } public function processCommand(\Magento\Backend\Model\Menu\Builder\AbstractCommand $command) // API param { // processCommand Code } }
Injeção de construtor
No exemplo de código, a classe Builder
declara sua dependência nas classes Factory
e Menu
em seu construtor. O Magento usa o di.xml
para determinar quais implementações devem ser injetadas na classe Builder
.
Dependências opcionais
Dependências opcionais são objetos que sua classe usa para métodos e cenários específicos. Se uma classe é cara para instanciar e sua classe nem sempre a usa, considere o uso de um proxy.
Você deve usar a injeção de dependência de construtor para todas as dependências opcionais e necessárias de um objeto.
Injeção de método
No exemplo de código, a classe Builder
também é dependente da classe CommandAbstract
para seu método processCommand()
.
A injeção de método envolve passar uma dependência como um parâmetro de método para usá-lo na lógica da classe. Quando um objeto precisa executar ações em uma dependência que não pode ser injetada, use a injeção de método.
Tipos de dependência
Injetável
Objetos injetáveis são objetos de serviço singleton
obtidos por meio de injeção de dependência. O Object Manager usa a configuração no di.xml
para criar esses objetos e injetá-los em construtores.
Objetos injetáveis podem depender de outros objetos injetáveis em seu construtor, desde que a cadeia de dependência não circule de volta ao objeto injetável original.
Objetos Novos / Não Injetável
Objetos novos ou não injetáveis são objetos que não podem ser injetados. Eles são obtidos criando uma nova instância de classe toda vez que forem necessários.
Objetos transitórios, como aqueles que exigem entrada externa do usuário ou banco de dados, se enquadram nessa categoria. Se você tentar injetar esses objetos, receberá um objeto incompleto, incorreto ou um erro que o objeto não pôde ser criado.
Por exemplo, você não pode depender de um objeto de model Product, porque precisa fornecer um ID de produto ou solicitar explicitamente uma nova instância vazia para obter um objeto Product
. Como você não pode especificar esses dados na assinatura do construtor, o Magento não pode injetar este objeto.
Para contornar essa limitação, objetos injetáveis podem depender de factories que produzem objetos novos.
Para mais informações, veja Dependency Injection.
Dúvidas? Posta aí!!!
Um abraço.