依存性注入を使用するためのルールで、Magento 2 devdocsは次のように述べています。
Newableオブジェクトは、注入可能なオブジェクトへのフィールド参照を保持したり、コンストラクターでフィールド参照を要求したりしてはなりません。これはデメテルの法則違反です。
これは良い目標だと私は理解していますが、Magento 2モデルでこれを実際にどのように実現できますか?
新しいアーキテクチャの優れた例として示されているCustomerモジュールを見ると、顧客モデルコンストラクターのシグネチャは次のようになります。
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 = []
)
そしてMagento\Framework\Model\Context
、すべてのモデルで使用されている単独で、5つの注入可能な引数を取ります。
どうやら、モデルはnewableですが、このルールの良い例ではありません。
自分のクラス(モデルではない)でベストプラクティスに従いたいのですが、関連するエンティティのリポジトリやイベントマネージャーなどにアクセスする必要があります。上からルールを破ることなくこれを処理するための好ましい方法は何でしょうか?
私は現在それを無視する傾向があります、またはせいぜい、それを原則としてではなく、友好的なガイドラインとして見ています。