1. Use injeção via construtor: sempre injete dependências por meio dos construtores. O Magento 2 incentiva a injeção via construtor em vez da injeção via método para melhor manutenibilidade e testabilidade do código.
    public function __construct(
        \Vendor\Module\Model\SomeModel $someModel,
        \Vendor\Module\Helper\Data $helper
    ) {
        $this->someModel = $someModel;
        $this->helper = $helper;
    }
  2. Use type hints nas dependências: use type hints nos parâmetros do construtor para especificar a classe/interface que a dependência deve ser. Isso ajuda na legibilidade do código e no autocomplete da IDE.
  3. Evite usar o Object Manager diretamente: não use o Object Manager diretamente para criar objetos. Em vez disso, dependa da injeção via construtor ou dos factory methods fornecidos pelo Magento.
    // Evite
    $object = \Magento\Framework\App\ObjectManager::getInstance()->get('SomeClass');
    // Prefira
    public function __construct(\Vendor\Module\SomeClassFactory $someClassFactory) {
        $this->someClassFactory = $someClassFactory;
    }
  4. Use factories para criar objetos: quando você precisar criar uma instância de uma classe, use as classes factory geradas pelo Magento. Evite instanciar classes diretamente.
    public function createSomeObject() {
        $someObject = $this->someClassFactory->create();
        // ...
    }

  5. Mantenha a lista de parâmetros do construtor curta: evite ter uma lista longa de parâmetros no construtor. Se você perceber que uma classe requer muitas dependências, isso pode ser um sinal de que a classe tem responsabilidades demais e deve ser refatorada.
  6. Use dependências por interface: sempre que possível, dependa de interfaces, e não de classes concretas. Isso torna seu código mais flexível e permite substituir implementações com mais facilidade.
    public function __construct(\Vendor\Module\Api\SomeInterface $someService) {
        $this->someService = $someService;
    }

  7. Aproveite os geradores de código: use geradores de código como bin/magento dev:di:info e bin/magento dev:di:compile para analisar e otimizar sua configuração de injeção de dependências.
  8. Evite dependências circulares: tenha cuidado com dependências circulares, pois elas podem levar a um código difícil de manter. Procure projetar suas classes para minimizar ou eliminar dependências circulares.
  9. Teste o seu código: sempre escreva testes unitários para as suas classes para garantir que as dependências sejam injetadas corretamente e que a classe se comporte conforme o esperado.
  10. Use Service Contracts: sempre que possível, use os service contracts e repositórios do Magento para interagir com as entidades do banco de dados. Isso promove uma forma consistente e estruturada de trabalhar com os dados.
  11. Siga os padrões de codificação do Magento: siga os padrões e melhores práticas de codificação do Magento ao escrever sua configuração de DI, suas classes e seus métodos.
  12. Use plugins com parcimônia: embora o sistema de plugins do Magento seja poderoso, evite abusar dele. Plugins devem ser reservados para casos em que nenhuma outra solução seja viável.