Felix Astner
JavaScript, Magento and other Software
Felix Astner

Fetching Products by SKU in Magento 2: A Best Practice Approach

In Magento 2, fetching products by their Stock Keeping Unit (SKU) is a common requirement for developers working on custom modules, themes, or any form of customization. Whether you're managing inventory, creating specialized product displays, or integrating with external systems, accessing product information reliably and efficiently is crucial. Magento 2's service contract methodology offers a standardized way to interact with the database, ensuring that your code remains upgradable and compatible with future releases. In this article, we'll explore the correct way to fetch products by SKU using the ProductRepositoryInterface.

The Importance of Using Service Contracts

Magento 2 introduces the concept of service contracts, which are a set of PHP interfaces that define the public API of a module. These service contracts provide a robust and flexible way to access and manipulate entity data, such as products, customers, and orders. By adhering to these contracts, developers can ensure their code is less susceptible to breakages during Magento updates, as the core team guarantees backward compatibility for these interfaces.

Fetching Products by SKU: A Step-by-Step Guide

To fetch a product by its SKU, Magento 2 recommends using the ProductRepositoryInterface. This approach abstracts the data source, allowing Magento to optimize the underlying queries and caching mechanisms. Here's a step-by-step guide on how to implement this in your custom module or script:

  1. Inject ProductRepositoryInterface: First, you need to inject Magento\Catalog\Api\ProductRepositoryInterface into your class. This is done through the constructor, ensuring that the dependency injection framework handles the instantiation.

private $productRepository;

public function __construct(
    \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
) {
    $this->productRepository = $productRepository;
  1. Fetch the Product: With ProductRepositoryInterface available, you can now fetch the product by its SKU. The get method provided by the interface accepts the SKU as a parameter and returns the product object.
public function loadMyProduct($sku)
    return $this->productRepository->get($sku);

Handling Exceptions

It's essential to note that if the product does not exist, the get method will throw a NoSuchEntityException. This behavior is by design, aligning with Magento's best practices for error handling. To gracefully manage this situation, wrap your product fetching logic in a try/catch block:

try {
    $product = $this->loadMyProduct($sku);
} catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
    // Handle the case when the product does not exist

Fetching products by SKU can be particularly useful in scenarios where you need to update product information based on external data sources. For instance, if you're synchronizing inventory levels from a warehouse management system, you can use the SKU to quickly locate and update the relevant product in Magento.


Felix Astner

As a software developer, I bring a specialized focus in web technologies, enriched by my interests in C++, AI, and computer theory. If you're in need of any freelance services, expert training, or insightful consulting, I encourage you to connect with me.