Continuando nossa série sobre Dependency Injection no Magento 2, hoje vamos falar aprender um pouco mais sobre o Object Manager.

O que é o Object Manager?

Conceitualmente falando, o Object Manager (OM) pode ser definido como uma classe de serviço do Magento que instancia os objetos do mesmo, bem como suas dependências.
Como foi mostrado no artigo anterior desta série, todas as dependências de uma classe no Magento 2 devem ser declaradas no método construtor da mesma. Com isso, o sistema automaticamente cria e injeta estas dependências na classe. Como ele faz isso? De forma transparente (under the hood) através do Object Manager.
Ou seja, ele é a parte do Magento 2 responsável pela criação de objetos/classes.
Ao analisar o código-fonte do Magento 2, você verá que o Object Manager é uma classe, localizada em ‘Magento\Framework\App\ObjectManager’. Esta classe é capaz de criar objetos sem depender de qualquer outra classe. Vamos voltar ao exemplo do último artigo:
<?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;
    }
 
}
No caso acima, seguimos as boas práticas recomendadas e injetamos a dependência ‘MagedIn\Validator\Helper\PasswordValidator’ através do construtor da nossa classe, certo?
Porém, esta dependência poderia ser criada diretamente através do OM, como mostrado no exemplo abaixo:
<?php
 
namespace MagedIn\TestModule\Helper;


class Data 
{
    private $passwordValidator;


    private $password;
    
    public function setPassword(string $newPassword): void
    {
        $this->passwordValidator = \Magento\Framework\App\ObjectManager::getInstance()->get(
            \MagedIn\Validator\Helper\PasswordValidator::class
        );
        $this->passwordValidator->validate($newPassword);
        $this->password = $newPassword;
    }
 
}
Alguns pontos importantes sobre o exemplo acima:
  • O trecho de código citado é somente para ilustrar o poder e a função do Object Manager;
  • Repare que o OM foi chamado diretamente, sem sequer ser injetado no construtor da classe, porém o OM não deve ser uma dependência em suas classes, pois ele instancia todas as dependências indiretamente;
  • O Magento desencoraja a utilização do OM diretamente, ou seja, fazer o que foi exemplificado no exemplo acima NÃO É UMA BOA PRÁTICA;
  • O uso direto do Object Manager vai contra o propósito/conceito de Dependency Injection.
  • O OM é uma camada que, em algum momento, pode ser substituída no Magento. Se você usá-lo diretamente em seu código, ele pode ser incompatível após essa possível mudançã por parte do Core Team.
Para fechar este assunto, para entender o Magento 2 como um todo, é importante que você saiba como o Object Manager funciona, quais os seus poderes e a forma como o Magento utiliza-o internamente.
Além disso, lembre-se que utilizar o Object Manager diretamente não é uma boa prática.

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

Dependency Injection no Magento 2 – Parte 2

– Equipe MagedIn University

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