So che un sacco di codice che è attualmente in Magento 2 (2.1.2) è più o meno portato da Magento 1 e che molto codice verrà sostituito da un equivalente in futuro. In questo aspetto, mi chiedo quale sia il futuro delle collezioni in Magento 2.
Lasciatemi spiegare:
Magento 1:
In Magento 1 siamo abituati a ottenere una raccolta come questa:
$products = Mage::getModel('catalog/product')->getCollection();
Potremmo quindi applicare filtri e altre operazioni alla raccolta:
$products->addAttributeToFilter('price', ['gteq' => 10]);
$products->addFieldToFilter('created_at', ['lt' => '2016-10-10']);
$products->setPageSize(10);
// ... etc ...
E, ultimo ma non meno importante, la nostra collezione restituirebbe i modelli:
foreach ($products as $product) {
echo get_class($product); // Mage_Catalog_Model_Product
}
Magento 2:
Magento aggiunge molti nuovi livelli di astrazione, implementando un modo di lavorare più SOLIDO. Ciò significa che quando vogliamo un elenco di entità, lo chiediamo a un repository:
$productResults = $this->productRepository->getList($searchCriteria);
Se vogliamo applicare filtri utilizziamo una combinazione di SearchCriteriaBuilder
, il FilterGroupBuilder
, il FilterBuilder
e il SortOrderBuilder
:
$this->searchCriteriaBuilder->addSortOrder(
$this->sortOrderBuilder
->setField('created_at')
->setAscendingDirection()
->create()
);
$priceFilter = $this->filterBuilder
->setField('price')
->setValue(10)
->setConditionType('gteq')
->create();
$createdAtFilter = $this->filterBuilder
->setField('created_at')
->setValue('2016-10-10')
->setConditionType('lt')
->create();
$filterGroups = [
$this->filterGroupBuilder->addFilter($priceFilter)->create(),
$this->filterGroupBuilder->addFilter($createdAtFilter)->create()
];
E se vogliamo scorrere i nostri risultati, otteniamo modelli di dati, non modelli effettivi (ereditati):
foreach ($productResults->getItems() as $product) {
echo get_class($product); // \Magento\Catalog\Model\Data\Product
}
Questo tipo di astrazione segue il principio SOLIDO e abbraccia il principio della "composizione sull'eredità" . Qualsiasi operazione "esotica" che verrebbe altrimenti eseguita sulla raccolta (come i join per gli esempi) viene eseguita internamente nel repository, il che semplifica anche l'utilizzo all'esterno del modulo.
La domanda:
Tutto ciò mi fa meravigliare: con l'intero repository / approccio al modello di dati, c'è spazio nel futuro di Magento 2 per le collezioni? Le raccolte devono essere utilizzate solo internamente dal modulo stesso e non al di fuori di esso? O saranno deprecati a favore del Gestore delle entità?
Attualmente, se si desidera abbracciare i modelli di dati, è comunque necessario creare un modello ereditato (ereditato da \Magento\Framework\Model\AbstractModel
) solo per far funzionare la raccolta (poiché Magento\Framework\Data\Collection::setItemObjectClass
richiede l'estensione del modello Magento\Framework\DataObject
). Ed è necessario eseguire la raccolta per poter filtrare nel proprio repository. Ma ancora una volta, nel repository devi 'convertire' il tuo modello (normale) in un modello dati.
Oppure dobbiamo implementarlo come il repository degli ordini, dove getList()
restituisce un'istanza di Magento\Sales\Api\Data\OrderSearchResultInterface
, ma sott'acqua i risultati della ricerca non sono altro che una raccolta regolare che implementa questa interfaccia. Curiosità: i risultati della ricerca indicano che restituirà una matrice di modelli di dati ( Magento\Sales\Api\Data\OrderInterface[]
), ma se si analizza il codice, getItems()
verrà eseguito il Magento\Framework\Data\Collection::getItems()
quale in cambio restituirà non i modelli di dati, ma i modelli di ordine (come impostato da Magento\Sales\Model\ResourceModel\Order\Collection::_construct()
). Questo per quanto riguarda la "composizione oltre l'eredità".
Molte domande su qual è il modo corretto in Magento 2. Ancora una volta, ci sono 100 modi per fare la stessa cosa, ma qual è "The Magento Way"? O sono semplicemente sulla strada sbagliata qui?