Magento2 DataProvider関連のメモ
1. 概要
Magento2 エクステンションの作成 その4でGridにDataProviderを介してデータを読み込む処理を扱ったが、各クラスの関連がわかりづらいのでその解説。
2. 関連クラス
DataProvider
DBからデータを読み込みを行う大元のクラス。UI components等から指定するクラス。
Reporting
コレクションに対してページネーションのページ指定や絞り込み条件を指定して返す。
CollectionFactory
Modelの集合を扱うコレクションを生成する。
SearchResult
コレクションクラス。CollectionFactoryが生成するコレクションはSearchResultを継承している。
※namespaceはMagento\Framework\View\Element\UiComponent\DataProvider
3. データ取得時の流れ
各クラスの関連とデータ取得時の流れを図1に示す。
図1 DataProvider経由でデータを取得する流れ
まず、各クラスの関連としては、DataProviderはReportingを、ReportingはCollectionFactoryを所有する。CollectionFactoryは'topic_listing_data_source'のデータ取得リクエストに対してBitHive\Topic\Model\ResourceModel\Post\Grid\Collectionを生成して返すように$collectionsコンストラクタ引数が設定されている。これはTopicエクステンションのetc/di.xmlで設定している(Magento2 エクステンションの作成 その4参照)。
実際にGridのデータを取得する際には、DataProviderのgetSearchResult()が呼び出される。このあと順次、Reporting::search()、CollectionFactory::getReport()が呼び出される。getReport()が呼び出される際、GridのUI componentsの<dataProvider>タグのname属性で指定した'topic_listing_data_source'が引数として渡される。
CollectionFactoryは'topic_listing_data_source'に対してBitHive\Topic\Model\ResourceModel\Post\Grid\Collectionを生成するようにetc/di.xmlで設定されているので、このコレクションを生成して返す。Reportは返されたコレクションに検索条件等の絞り込み情報を追加してDataProviderに返すという流れになる。
Magento2 エクステンションの作成 その4でも説明したが、BitHive\Topic\Model\ResourceModel\Post\Grid\Collectionはetc/di.xmlで定義したVirtualTypeで実在はしない(Magento2が自動生成するという意味では存在するが)。etc/di.xmlでBitHive\Topic\...(略)...\CollectionはSearchResultクラスを継承するように設定されている。