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