Magento 2 Service Contracts & Repositories
Before writing code
Fetch live docs:
- Fetch
https://developer.adobe.com/commerce/php/development/components/web-api/services/ for service contract guide
- Fetch
https://developer.adobe.com/commerce/php/development/components/searching-with-repositories/ for SearchCriteria patterns
- Web-search
site:developer.adobe.com commerce php development components service-contracts for additional reference
Conceptual Architecture
What Service Contracts Are
Service contracts are PHP interfaces that define a module's public API. They guarantee backward compatibility — implementations can change across versions without breaking consumers.
Three Interface Categories
Repository Interfaces (Api/SomeRepositoryInterface.php)
getById($id) — retrieve single entity
save(SomeInterface $entity) — create or update
delete(SomeInterface $entity) — remove
getList(SearchCriteriaInterface $criteria) — filtered/sorted/paginated results
Data Interfaces (Api/Data/SomeInterface.php)
- Define getters and setters for entity fields
getId(), setId($id), getName(), setName($name), etc.
- Constants for field names:
const NAME = 'name';
SearchResults Interface (Api/Data/SomeSearchResultsInterface.php)
- Extends
Magento\Framework\Api\SearchResultsInterface
- Wraps
getItems() / setItems() with typed returns
SearchCriteria Pattern
Used for querying repositories with filters, sorting, and pagination:
- SearchCriteriaBuilder — fluent builder for criteria
- FilterBuilder — builds individual filter conditions
- FilterGroupBuilder — groups filters with AND/OR logic
- SortOrderBuilder — defines sort order
- CollectionProcessorInterface — applies criteria to collections
Filter Logic
- Filters within a FilterGroup are OR'd together
- FilterGroups are AND'd together
- Condition types:
eq, neq, gt, gteq, lt, lteq, like, in, nin, notnull, null, from, to
Repository Implementation Pattern
The concrete repository class:
- Injects: Model Factory, Resource Model, Collection Factory, SearchResultsFactory, CollectionProcessor
getById() — creates model via factory, loads via resource model
save() — calls resource model save(), handles exceptions
delete() — calls resource model delete()
getList() — creates collection, applies criteria via CollectionProcessor, wraps in SearchResults
Service Contracts as Web API
When you define a service contract interface and map it in webapi.xml, the same code serves:
- REST API endpoints
- SOAP API endpoints
- Internal PHP calls
Best Practices
- Always define data interfaces — don't expose models directly
- Use typed return types and parameter types on all interface methods
- Add
@api annotation to indicate public API stability
- Use
SearchCriteriaBuilder instead of raw collection filtering in service layer
- Throw specific exceptions:
NoSuchEntityException, CouldNotSaveException, CouldNotDeleteException
- Map service contracts in
webapi.xml for automatic REST/SOAP exposure
Fetch the service contracts and searching-with-repositories docs for exact interface signatures, exception classes, and CollectionProcessor usage before implementing.
1---2name: magento-service-contracts3description: Implement Magento 2 service contracts — repository interfaces, data interfaces, SearchCriteria, and the repository pattern. Use when building module APIs, data access layers, or integrating with Magento's Web API.4---56# Magento 2 Service Contracts & Repositories78## Before writing code910**Fetch live docs**:111. Fetch `https://developer.adobe.com/commerce/php/development/components/web-api/services/` for service contract guide122. Fetch `https://developer.adobe.com/commerce/php/development/components/searching-with-repositories/` for SearchCriteria patterns133. Web-search `site:developer.adobe.com commerce php development components service-contracts` for additional reference1415## Conceptual Architecture1617### What Service Contracts Are1819Service contracts are **PHP interfaces** that define a module's public API. They guarantee backward compatibility — implementations can change across versions without breaking consumers.2021### Three Interface Categories22231. **Repository Interfaces** (`Api/SomeRepositoryInterface.php`)24 - `getById($id)` — retrieve single entity25 - `save(SomeInterface $entity)` — create or update26 - `delete(SomeInterface $entity)` — remove27 - `getList(SearchCriteriaInterface $criteria)` — filtered/sorted/paginated results28292. **Data Interfaces** (`Api/Data/SomeInterface.php`)30 - Define getters and setters for entity fields31 - `getId()`, `setId($id)`, `getName()`, `setName($name)`, etc.32 - Constants for field names: `const NAME = 'name';`33343. **SearchResults Interface** (`Api/Data/SomeSearchResultsInterface.php`)35 - Extends `Magento\Framework\Api\SearchResultsInterface`36 - Wraps `getItems()` / `setItems()` with typed returns3738### SearchCriteria Pattern3940Used for querying repositories with filters, sorting, and pagination:4142- **SearchCriteriaBuilder** — fluent builder for criteria43- **FilterBuilder** — builds individual filter conditions44- **FilterGroupBuilder** — groups filters with AND/OR logic45- **SortOrderBuilder** — defines sort order46- **CollectionProcessorInterface** — applies criteria to collections4748### Filter Logic4950- Filters within a **FilterGroup** are OR'd together51- **FilterGroups** are AND'd together52- Condition types: `eq`, `neq`, `gt`, `gteq`, `lt`, `lteq`, `like`, `in`, `nin`, `notnull`, `null`, `from`, `to`5354### Repository Implementation Pattern5556The concrete repository class:571. Injects: Model Factory, Resource Model, Collection Factory, SearchResultsFactory, CollectionProcessor582. `getById()` — creates model via factory, loads via resource model593. `save()` — calls resource model `save()`, handles exceptions604. `delete()` — calls resource model `delete()`615. `getList()` — creates collection, applies criteria via CollectionProcessor, wraps in SearchResults6263### Service Contracts as Web API6465When you define a service contract interface and map it in `webapi.xml`, the same code serves:66- REST API endpoints67- SOAP API endpoints68- Internal PHP calls6970### Best Practices7172- Always define data interfaces — don't expose models directly73- Use typed return types and parameter types on all interface methods74- Add `@api` annotation to indicate public API stability75- Use `SearchCriteriaBuilder` instead of raw collection filtering in service layer76- Throw specific exceptions: `NoSuchEntityException`, `CouldNotSaveException`, `CouldNotDeleteException`77- Map service contracts in `webapi.xml` for automatic REST/SOAP exposure7879Fetch the service contracts and searching-with-repositories docs for exact interface signatures, exception classes, and CollectionProcessor usage before implementing.