In den Regeln für die Verwendung der Abhängigkeitsinjektion geben die Magento 2-Devdocs Folgendes an:
Newable-Objekte sollten weder einen Feldverweis auf ein injizierbares Objekt enthalten noch einen in ihrem Konstruktor anfordern. Dies ist ein Verstoß gegen das Gesetz von Demeter .
Ich verstehe, dass dies ein gutes Ziel ist, aber wie ist dies mit Magento 2-Modellen tatsächlich möglich?
Wenn wir einen Blick auf das Kundenmodul haben, die als leuchtendes Beispiel für die neue Architektur vorgestellt wurde, werden die Kunden Modell sieht Konstruktor Signatur wie folgt aus :
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 = []
)
Und Magento\Framework\Model\Context
allein, was von allen Modellen verwendet wird, benötigt fünf injizierbare Argumente.
Anscheinend sind Modelle, obwohl neuwertig , überhaupt kein gutes Beispiel für diese Regel.
Ich möchte Best Practices mit meinen eigenen Klassen (nicht einmal Modellen) befolgen, benötige jedoch Zugriff auf Dinge wie Repositorys verwandter Entitäten oder auf den Event-Manager. Was wäre der bevorzugte Weg, um damit umzugehen, ohne die Regel von oben zu brechen?
Ich neige derzeit dazu, es zu ignorieren oder es bestenfalls als freundliche Richtlinie zu betrachten, nicht in der Regel.