productFactory = $productFactory; $this->productRepositoryFactory = $productRepositoryFactory; $this->stockRegistry = $stockRegistry; $this->stockRegistryStorage = $stockRegistryStorage; } /** * Create an example product including stock * * Performs 3 database queries * * @param callable $productConfiguration Receives 1 parameter of ProductInterface. Should return a ProductInterface * @param bool $isInStock * @param int $stockQty * @return ProductInterface * @throws \Magento\Framework\Exception\CouldNotSaveException * @throws \Magento\Framework\Exception\InputException * @throws \Magento\Framework\Exception\NoSuchEntityException * @throws \Magento\Framework\Exception\StateException */ public function createExampleProduct(callable $productConfiguration = null, $isInStock = true, $stockQty = 500) { return $this->createProduct( function (ProductInterface $product) use ($productConfiguration) { $product->setName(static::EXAMPLE_PRODUCT_NAME); $product->setSku(static::EXAMPLE_PRODUCT_SKU); $product->setPrice(static::EXAMPLE_PRODUCT_PRICE); $product->setVisibility(static::EXAMPLE_PRODUCT_VISIBILITY); $product->setStatus(static::EXAMPLE_PRODUCT_STATUS); $product->setTypeId(static::EXAMPLE_PRODUCT_TYPE); $product->setAttributeSetId(static::EXAMPLE_PRODUCT_ATTRIBUTE_SET); return $productConfiguration !== null ? $productConfiguration($product) : $product; }, $isInStock, $stockQty ); } /** * Create a product including stock * * Performs 3 database queries. * * @param callable $productConfiguration Receives 1 parameter of ProductInterface. Should return a ProductInterface * @param bool $isInStock * @param int $stockQty * @return ProductInterface * @throws \Magento\Framework\Exception\CouldNotSaveException * @throws \Magento\Framework\Exception\InputException * @throws \Magento\Framework\Exception\NoSuchEntityException * @throws \Magento\Framework\Exception\StateException */ public function createProduct(callable $productConfiguration, $isInStock = true, $stockQty = 500) { /** @var ProductInterface $product */ $product = $this->productFactory->create(); $product = $productConfiguration($product); if (!($product instanceof ProductInterface)) { throw new \TypeError('Result of createProduct callback must return a ProductInterface'); } /** @var ProductRepositoryInterface $productRepository */ $productRepository = $this->productRepositoryFactory->create(); $product = $productRepository->save($product); $stockItem = $this->stockRegistry->getStockItemBySku($product->getSku()); $stockItem->setIsInStock($isInStock); $stockItem->setQty($stockQty); $this->stockRegistry->updateStockItemBySku($product->getSku(), $stockItem); // Reload product in such a way as to re-generate saleability data $this->stockRegistryStorage->removeStockStatus($product->getId()); $this->stockRegistryStorage->removeStockItem($product->getId()); $product = $productRepository->get($product->getSku()); return $product; } }