Grandes aplicações, como o Magento, usam o Object Manager para evitar o recarregamento de objetos já instanciados. Ele não só instancia novos objetos, como implementa o design patter singleton, substituindo o Mage::Singleton()
, e manipula a instanciação de parâmetros.
No Magento framework, a implementação do ObjectManagerInterface()
executa as tarefas do Object Manager.
Responsabilidades:
O Object Manager tem as seguintes responsabilidades:
- Criação de objectos em factories e proxies;
- Implementando o padrão Singleton retornando a mesma instância de uma classe quando solicitada;
- Gerenciamento de dependência, instanciando a classe preferida quando um construtor solicita sua interface;
- Automaticamente instanciando parâmetros em construtores de classe.
Configuração:
O arquivo di.xml
configura o object manager e informa com lidar com a injeção de dependência.
Este arquivo especifica a classe de implementação preferida que o gerenciador de objetos gera para a interface declarada em um construtor de classe.
O arquivo também especifica se o gerenciador de objetos deve criar um objeto para cada solicitação ou tratar o objeto como um singleton.
Regras de Uso:
O Magento framework usa o ObjectManager
para gerar e injetar as classes declaradas em seu construtor. As classes não devem solicitar o ObjectManager
próprio como uma dependência do construtor.
Você não chama o gerenciador de objetos diretamente porque o framework manipula isso automaticamente. O uso direto do método create
impede a validação de tipo.
A criação de objetos também é uma responsabilidade separada que deve ser movida para uma classe dedicada, como uma factory ou um proxy . Na maioria dos casos, o framework gera essas classes automaticamente durante a compilação de código.
Você pode notar na base de código do Magento 2 que algumas classes principais ainda chamam ObjectManager diretamente. Esse código precisa ser portado ou existir para fins de compatibilidade com versões anteriores.
Exceções:
Você pode depender e usar o Object Manager nos seguintes casos:
- Você pode usá-lo em métodos mágicos estáticos, como
__wakeup()
,__sleep()
- Um exemplo pode ser encontrado no método
__wakeup()
da classeMagento/Eav/Model/Entity/Attribute/AbstractAttribute
;
- Um exemplo pode ser encontrado no método
- Você pode usá-lo para manter a compatibilidade com versões anteriores para um construtor;
- Em um escopo global, pode ser usado como em fixtures de testes de integração;
- Pode ser uma dependência em classes usadas para a criação de objetos, por exemplo, factories ou proxies.
Dúvidas? Posta aí!!!
Um abraço.