magento 2でコレクションを取得するための最良の方法はどれですか


7

カスタムモジュールを作成しています。これは、コレクションを取得するための好ましい方法です。これらの方法の長所と短所を知る必要がありますか?

objectManager

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$productCollection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\Collection');
$productCollection->load();

工場

protected $_productCollectionFactory;

    public function __construct(
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
        array $data = []
    ) {
        $this->_productCollectionFactory = $productCollectionFactory;
        parent::__construct($data);
    }



    public function getProductCollection()
    {
        /** @var $collection \Magento\Catalog\Model\ResourceModel\Product\Collection */
        $collection = $this->_productCollectionFactory->create();
        return $collection;
    }

回答:


14

ファクトリアプローチを使用する必要があります。
利点は、特定のコレクションが取得されたときに、ある時点でいくつかの一般的な動作を追加することを決定できることです。ファクトリが自動生成されている場合は、ファクトリクラスを作成して、コードに動作を追加するだけです。このようにして、自動生成されたクラスの代わりにファクトリが使用されます。
これは、のgetName代わりにメソッドを使用するのと似ていgetData('name')ます。

オブジェクトマネージャーを使用する利点は、少ないコードを記述する必要があることですが、これでは正しくなりません。


7

ファクトリは、1つの目的のみを持つ特別なオブジェクトです。つまり、1つの非注入クラスまたはインターフェイスのインスタンスを作成します。

詳細は公式ドキュメントをご覧ください


2

2番目のコンストラクター注入メソッドを使用します。

コレクションを取得するにはファクトリメソッドがベストプラクティスなので、ファクトリメソッドを使用します。

ただし、コンストラクターインジェクションがコレクションに対して機能しないため、一部の場所ではObjectManagerが手に入ります(つまり、オブザーバークラス)。

残りは、KAndyの与えられた公式のmagentoリンクで説明されています。


3
「コンストラクタインジェクションはコレクション(つまり、オブザーバークラス)では機能しません」-どういう意味ですか?どう\Magento\Framework\Event\ObserverFactoryですか?
nevvermind 2016年

2

使用ファクトリメソッドは、 Magentoの2でのObjectManagerの代わりに使用するための最良の方法です。

コアシステムmagento 2では、ほとんどの場合、objectmanagerではなくFactoryメソッドが使用されます。

ルートスクリプトで遊んでいるときにobjectmanagerの概念を使用するか、テンプレートファイルのブロックを作成していません。あなたは直接objectmanagerを呼び出すことができます。

ただし、Factorymethodはmagento 2システムで使用する適切な方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.