1. Utilice la inyección por constructor: inyecte siempre las dependencias a través del constructor. Magento 2 fomenta la inyección por constructor frente a la inyección por método para mejorar la mantenibilidad y la testabilidad del código.
    public function __construct(
        \Vendor\Module\Model\SomeModel $someModel,
        \Vendor\Module\Helper\Data $helper
    ) {
        $this->someModel = $someModel;
        $this->helper = $helper;
    }
  2. Indique el tipo de las dependencias: aplique type hints a los parámetros del constructor para especificar la clase/interfaz que debe ser la dependencia. Mejora la legibilidad del código y el autocompletado del IDE.
  3. Evite usar el Object Manager directamente: no utilice el Object Manager directamente para crear objetos. En su lugar, recurra a la inyección por constructor o a los factory methods proporcionados por Magento.
    // Evitar
    $object = \Magento\Framework\App\ObjectManager::getInstance()->get('SomeClass');
    // Preferir
    public function __construct(\Vendor\Module\SomeClassFactory $someClassFactory) {
        $this->someClassFactory = $someClassFactory;
    }
  4. Use factorías para crear objetos: cuando necesite crear una instancia de una clase, utilice las clases factory generadas por Magento. Evite instanciar clases directamente.
    public function createSomeObject() {
        $someObject = $this->someClassFactory->create();
        // ...
    }

  5. Mantenga corta la lista de parámetros del constructor: evite tener una lista larga de parámetros en el constructor. Si una clase requiere demasiadas dependencias, puede ser señal de que asume demasiadas responsabilidades y debería refactorizarse.
  6. Dependa de interfaces: siempre que sea posible, dependa de interfaces en lugar de clases concretas. Esto hace que su código sea más flexible y permite sustituir implementaciones con mayor facilidad.
    public function __construct(\Vendor\Module\Api\SomeInterface $someService) {
        $this->someService = $someService;
    }

  7. Aproveche los generadores de código: utilice generadores como bin/magento dev:di:info y bin/magento dev:di:compile para analizar y optimizar la configuración de inyección de dependencias.
  8. Evite dependencias circulares: tenga cuidado con las dependencias circulares, ya que dificultan el mantenimiento. Diseñe sus clases para minimizar o eliminar ese tipo de dependencias.
  9. Pruebe su código: escriba siempre tests unitarios para sus clases con el fin de garantizar que las dependencias se inyectan correctamente y que la clase se comporta como se espera.
  10. Use los service contracts: siempre que sea posible, utilice los service contracts y repositorios de Magento para interactuar con las entidades de la base de datos. Esto promueve una forma de trabajar con los datos coherente y estructurada.
  11. Siga los estándares de codificación de Magento: respete los estándares y buenas prácticas de Magento al escribir su configuración DI, clases y métodos.
  12. Use los plugins con moderación: aunque el sistema de plugins de Magento es potente, evite abusar de él. Los plugins deben reservarse para los casos en los que no exista otra solución viable.