Nas Regras de uso da injeção de dependência , os devdocs do Magento 2 afirmam:
Objetos renováveis não devem conter uma referência de campo a um objeto injetável, nem devem solicitar uma em seu construtor. Esta é uma violação da Lei de Deméter .
Entendo que esse é um bom objetivo, mas como isso é realmente possível nos modelos Magento 2?
Se dermos uma olhada no módulo Customer, que foi apresentado como um exemplo brilhante para a nova arquitetura, a assinatura do construtor do modelo do cliente é semelhante a esta:
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Eav\Model\Config $config,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Customer\Model\ResourceModel\Customer $resource,
\Magento\Customer\Model\Config\Share $configShare,
\Magento\Customer\Model\AddressFactory $addressFactory,
\Magento\Customer\Model\ResourceModel\Address\CollectionFactory $addressesFactory,
\Magento\Framework\Mail\Template\TransportBuilder $transportBuilder,
GroupRepositoryInterface $groupRepository,
\Magento\Framework\Encryption\EncryptorInterface $encryptor,
\Magento\Framework\Stdlib\DateTime $dateTime,
CustomerInterfaceFactory $customerDataFactory,
DataObjectProcessor $dataObjectProcessor,
\Magento\Framework\Api\DataObjectHelper $dataObjectHelper,
\Magento\Customer\Api\CustomerMetadataInterface $metadataService,
\Magento\Framework\Indexer\IndexerRegistry $indexerRegistry,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
array $data = []
)
E Magento\Framework\Model\Context
sozinho, que é usado por todos os modelos, leva cinco argumentos injetáveis .
Aparentemente modelos, embora newable , não são um bom exemplo a todos para esta regra.
Quero seguir as práticas recomendadas com minhas próprias classes (nem mesmo modelos), mas preciso acessar itens como repositórios de entidades relacionadas ou o gerenciador de eventos. Qual seria a maneira preferida de lidar com isso sem quebrar a regra de cima?
Atualmente, costumo ignorá-lo ou, na melhor das hipóteses, vê-lo como orientação amigável, não como regra.