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