M

Suivez nous

Repository ou Collection dans Magento 2 : dans quels cas les utiliser ?

Lorsqu’on manipule des entités dans Magento 2, deux approches principales s’offrent à nous, utiliser un Repository ou interagir avec une Collection.

Ces deux méthodes ont des usages bien distincts. Il est donc essentiel de comprendre leurs objectifs respectifs afin d’éviter les mauvaises pratiques.


1. Lors de la première manipulation d’un objet Magento 2

Quand on développe certaines fonctionnalités dans un module Magento 2, il est souvent nécessaire d’interagir avec la base de données. Pour cela, Magento propose différents outils permettant de récupérer, modifier, ajouter ou supprimer des données. Parmi eux, on retrouve :

  • Le repository, qui fournit des méthodes pour récupérer une instance d’un objet.
  • La collection, qui permet d’accéder à des objets selon des critères spécifiques.

La frontière entre ces deux approches peut parfois sembler floue, car elles peuvent toutes deux aboutir à un résultat similaire. Pourtant, leur usage doit être défini en fonction du but de la récupération des données.


2. Le Repository : pour un usage unitaire

Le repository est un standard Magento 2, qui fournit plusieurs méthodes pour récupérer, sauvegarder ou supprimer une entité. Par exemple, pour un produit, on dispose des méthodes suivantes :

  • get($sku, $editMode = false, $storeId = null, $forceReload = false) : permet de récupérer un produit à partir de son SKU.
  • getById($productId, $editMode = false, $storeId = null, $forceReload = false) : permet de récupérer un produit à partir de son ID.

Il offre également la possibilité de récupérer une liste d’entités via la méthode getList(), qui prend en paramètre un objet de type SearchCriteriaInterface. Celui-ci permet d’appliquer des filtres, des tris et une pagination.

Bien que très pratiques, les repositories souffrent parfois d’un manque de cohérence dans leur structure. On les retrouve tantôt dans le dossier Model (ce qui serait le plus logique), tantôt dans ResourceModel.

Dans tous les cas, un repository s’appuie sur un ResourceModel pour effectuer les opérations en base. Il constitue une surcouche plus propre à l’ancienne méthode $model->load($id), aujourd’hui dépréciée.

Les repositories sont généralement couplés à une interface, ce qui permet de les exposer facilement via les API de Magento.

Ces méthodes retournent un objet complet, qui contient non seulement les données principales de l’entité (par exemple le produit), mais aussi celles provenant des tables associées (comme les catégories ou les attributs personnalisés).

On se retrouve donc avec des objets riches, mais potentiellement lourds, surtout si l’on n’a besoin que de quelques données.


3. La Collection : pour un accès de masse et optimisé

La collection, quant à elle, permet une interaction plus directe avec la base de données. Elle autorise la récupération d’enregistrements selon des critères spécifiques, à la manière de requêtes SQL.

Par exemple :

$productCollection->addAttributeToFilter($attribute, $condition, $joinType);

Cela permet de récupérer plusieurs enregistrements, ou un seul, selon les besoins (par exemple via le SKU ou l’ID).

Cette méthode est plus légère car elle ne charge que les données nécessaires. On peut également effectuer des jointures, comme dans l’exemple suivant :

$productCollection->joinTable(
    ['ccp' => 'catalog_category_product'],
    'product_id = entity_id',
    ['product_category_ids' => 'category_id']
)->addAttributeToFilter('product_category_ids', ['in' => $categories]);

4. Pourquoi ne pas toujours utiliser le repository, même pour un seul objet ?

Dans le cas d’objets complexes comme les produits, utiliser un repository peut être contre-productif si l’on n’a besoin que de quelques champs (par exemple, le prix). Cela génère de nombreuses requêtes inutiles à cause des jointures effectuées automatiquement.

Dans ce cas, utiliser une collection est préférable : cela limite les requêtes et permet une bien meilleure optimisation en fonction des données réellement nécessaires.

Cependant, le repository reste indispensable dans certaines situations, notamment lorsque de nombreuses informations doivent être récupérées sur une entité.


En résumé

De manière générale, il est recommandé de privilégier l’usage des collections pour leur souplesse et leurs performances. Les repositories doivent être réservés aux cas où leur usage est vraiment nécessaire, notamment lorsqu’il est impossible de procéder autrement.