Contextualizando
Magento 2 e a injeção de dependência
Para entender melhor a injeção de dependência é importante o conhecimento do 5º princípio do SOLID, a Inversão de Dependência (Dependency Inversion Principle).
É chamada de dependência cada instância de objeto dentro de uma determinada classe, porque a classe fica dependente da instância do objeto para ser executada. Para a injeção desta instância, é recomendado, que seja realizado através do DIP (Inversão de dependência).
A Injeção de dependência é um padrão de projeto (design pattern) que permite uma classe mantenha um baixo nível de acoplamento entre diferentes módulos do sistema, ou seja, permite que uma classe não seja responsável por criar os objetos dos quais depende.
Object Manager
O Object Manager é uma classe de serviço do Magento que instancia objetos no início do processo de bootstrap, gerando e injetando as classes declaradas no arquivo di.xml
como dependências nos construtores das classes instanciadas.
Como o Object Manager fornece seu serviço indiretamente, a classe não deve depender do próprio Object Manager. As únicas exceções são factories personalizadas com lógica complexa e integrações de testes que necessitam das configurações de ambiente.
O Magento utiliza sua ferramenta de compilação de código para coletar todas as informações das dependências das classes e as armazena em arquivos. Durante o processo de criação das classes, o Object Manager utiliza essas informações de criação para criar objetos concretos na aplicação.
Classes de serviço que não existem no código base, como proxies, factories e interceptors que são declarados no código ou nas configurações, são gerados com a ajuda do compilador.
Tipos Virtuais (virtual type)
Uma classe do tipo virtual é uma forma diferente de injetar as dependências dentro de uma classe PHP sem afetar outras classes e sem criar um arquivo PHP.
Criar um tipo virtual (virtual type) significa criar uma sub-classe para uma classe já existente. Qualquer classe concreta está disponível para a utilização de uma classe do tipo virtual.
Os tipos virtuais podem se basear nas classes que são definidas no atributo <type>
, saiba como criar classes que utilizam argumentos injetáveis via o arquivo di.xml
no post "Como definir valores específicos dos argumentos do construtor no Magento 2 utilizando type".
Código para tipos virtuais
di.xml
Um tipo virtual permite alterar os argumentos de uma dependência injetável específica e alterar o comportamento de uma classe específica. Isso permite utilizar uma classe personalizada sem afetar outras classes que possuem uma dependência da classe original. Assim, não é necessário criar uma classe concreta. Este tipo de funcionalidade deve ser implementada dentro do arquivo di.xml
, seguindo a estruturas de pastas \{Vendor}\{Module}\etc\{area}\di.xml
.
O atributo name
do nó <virtualType>
representa o nome da classe que será gerada virtualmente e o atributo type
representa de qual classe concreta a classe virtual estenderá.
O valor do atributo name
do nó <argument>
deve corresponder ao nome do parâmetro no construtor da classe configurada.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="{VirtualTypeName}" type="{Vendor}\{Module}\{Directory}\{ClassName}">
<arguments>
<argument name="{attrObject}" xsi:type="object">{Vendor}\{Module}\{Directory}\{ClassValue}</argument>
<argument name="{attrString}" xsi:type="string">{string_value}</argument>
<argument name="{attrBool}" xsi:type="boolean">{bollean_value}</argument>
<argument name="{attrNumber}" xsi:type="number">{integer_value}</argument>
<argument name="{attrArray}" xsi:type="array">
<item name="{keyName}" xsi:type="{type}">{value}</item>
</argument>
<argument name="{attrNull}" xsi:type="null" />
<argument name="{attrConst}" xsi:type="const">{Vendor}\{Module}\{Directory}\{ClassValue}::{CONST_NAME}</argument>
</arguments>
</virtualType>
</config>
Finalizando
Valores entre chaves (
{test}
) devem ser alterados na implementação do código.
Habilitando as alterações
Apague os arquivos que são gerados na compilação do Magento e execute o comando PHP para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc).
rm -rf var/generation/
rm -rf generated/
php bin/magento setup:di:compile
Diretórios e Arquivos
Segue a a lista de diretórios e arquivos que devem ser criados.
- app/
- code/
- {Vendor}/
- {Module}/
- etc/
- di.xml
- module.xml
- registration.php
- composer.json