Magento 2 Repositories

Repositories in Magento 2 provide a standard way to access and manage data entities. They act as an abstraction layer between the business logic and the database models (like EAV or Flat).

πŸ“˜ What Is a Repository?

A repository is a PHP class that provides methods like `getById`, `save`, `delete`, and `getList` for a specific entity (e.g., product, category, customer).

βœ… Magento auto-generates many of them from service contracts like `ProductRepositoryInterface`.

πŸ’‘ Benefits of Using Repositories

  • πŸ”’ Encapsulates database logic
  • πŸ“¦ Supports service contracts
  • πŸ§ͺ Great for unit testing (no direct DB access)
  • 🧩 Helps with clean code architecture

πŸ›’ Example: Product Repository

use Magento\Catalog\Api\ProductRepositoryInterface;

class ProductHelper
{
    protected $productRepository;

    public function __construct(ProductRepositoryInterface $productRepository)
    {
        $this->productRepository = $productRepository;
    }

    public function getProduct($id)
    {
        return $this->productRepository->getById($id);
    }

    public function deleteProduct($product)
    {
        return $this->productRepository->delete($product);
    }
}

🧠 Memory Tip: **CRUD = Create, Read, Update, Delete**
Repositories simplify CRUD operations without writing raw SQL or loading models manually.

πŸ“¦ Common Repository Interfaces

Entity Repository Interface
Product Magento\Catalog\Api\ProductRepositoryInterface
Customer Magento\Customer\Api\CustomerRepositoryInterface
Order Magento\Sales\Api\OrderRepositoryInterface
Category Magento\Catalog\Api\CategoryRepositoryInterface

🧰 Getting a List of Products (getList)

Use `SearchCriteriaBuilder` to filter data:

use Magento\Framework\Api\SearchCriteriaBuilder;

public function __construct(
    ProductRepositoryInterface $productRepository,
    SearchCriteriaBuilder $searchCriteriaBuilder
) {
    $this->productRepository = $productRepository;
    $this->searchCriteriaBuilder = $searchCriteriaBuilder;
}

public function getAllProducts() {
    $criteria = $this->searchCriteriaBuilder->create();
    return $this->productRepository->getList($criteria)->getItems();
}

🚫 Avoid Using Models Directly

❌ Don’t do this in service or API code:

$product = $this->_productFactory->create()->load($id);

 

βœ… Use repository:

$product = $this->productRepository->getById($id);

 

βœ… Summary

  • Repositories provide a consistent interface for entity data
  • They improve modularity and testability
  • Use DI to inject repositories and avoid direct model usage