Como definir valores específicos dos argumentos do construtor no Magento 2 utilizando type

Lucas Teixeira dos Santos Santana - Oct 29 '21 - - Dev Community

Contextualizando

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.

Argumentos do Construtor (type)

O nó <type> é utilizado no arquivo di.xml para manipular as dependências injetadas nos construtores de uma determinada classe. O Object Manager injeta os <arguments> passados dentro do nó <type> para o construtor da classe durante a sua criação. Isto permite a utilização de classes personalizadas sem afetar outras classes que tem uma dependência original, como apresentado no post "Como sobrescrever arquivos no Magento 2 através de preferences".


Código para argumentos do construtor

di.xml

Configurações Type descreve o tipo de uma dependência do construtor de uma determinada classe e qual valor instanciar. Este tipo de funcionalidade deve ser implementada dentro do arquivo di.xml, seguindo a estruturas de pastas \{Vendor}\{Module}\etc\{area}\di.xml.

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="{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}\{ClassName}::{CONST_NAME}</argument>
        </arguments>
    </type>
</config>
Enter fullscreen mode Exit fullscreen mode

Valores Boleanos

Tipo Valor Passado Valor Convertido
bool true true
bool false false
string "true" (case-sensitive) true
string "false" (case-sensitive) false
string "1" true
string "0" false
integer 1 true
integer 0 false

Para configurar os argumentos do construtor da classe, o Object Manager injeta esses argumentos na classe durante a sua criação. O nome do argumento configurado no XML deve corresponder ao nome do parâmetro no construtor da classe configurada.

<?php

namespace {Vendor}\{Module}\{Directory};

use {Vendor}\{Module}\{Directory}\{ClassValue};

class {ClassName}
{
    public const CONST_NAME = '{constant value}';

    public function __construct(
        private {ClassValue} $attrObject,
        private string $attrString,
        private bool $attrBool,
        private int $attrNumber,
        private array $attrArray,
        private $attrNull,
        private $attrConst
    ) {
    }
}
Enter fullscreen mode Exit fullscreen mode

Finalizando

Valores entre chaves ({test}) devem ser alterados na implementação do código.

Habilitando as alterações

Comando para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc).

php bin/magento setup:di:compile
Enter fullscreen mode Exit fullscreen mode

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
          - {Directory}/
            - {ClassName}.php
            - {ClassValue}.php
          - registration.php
          - composer.json
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .