elasticsuite: Can not install Elasticsuite 2.7.0

Cannot instantiate interface Magento\InventorySalesApi\Api\StockResolverInterface

Preconditions

PHP 7.1.24, Elasticsearch 6.5

Magento Version : 2.3.0 CE

ElasticSuite Version : 2.7.0

Environment : Production

Third party modules : none

Steps to reproduce

After require and add config Elasticsuite follow wiki document run command bin/magento setup:upgrade

Expected result

  1. Install Elasticsuite without error

Actual result

  1. [Screenshot, logs]
Module 'Magento_WishlistAnalytics':
Module 'Smile_ElasticsuiteCore':
Module 'Smile_ElasticsuiteCatalog':
Installing data... PHP Fatal error:  Uncaught Error: Cannot instantiate interface Magento\InventorySalesApi\Api\StockResolverInterface in /var/www/clients/client0/web6/web/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php:50
Stack trace:
#0 /var/www/clients/client0/web6/web/vendor/magento/framework/ObjectManager/ObjectManager.php(70): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\\Invento...')
#1 /var/www/clients/client0/web6/web/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php(160): Magento\Framework\ObjectManager\ObjectManager->get('Magento\\Invento...')
#2 /var/www/clients/client0/web6/web/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php(246): Magento\Framework\ObjectManager\Factory\AbstractFactory->resolveArgument(Array, 'Magento\\Invento...', NULL, 'stockResolver', 'Smile\\Elasticsu...')
#3 /var/www/clients/client0/web6/web/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(34): Magento\Framework\ObjectManager\Factory\AbstractFactory->resol in /var/www/clients/client0/web6/web/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php on line 50

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Comments: 21 (5 by maintainers)

Commits related to this issue

Most upvoted comments

If the class Magento\InventorySalesApi\Api\StockResolverInterface cannot be instantiated, it is possible that the module is disabled in app/etc/config.php file. Make sure that the Inventory modules are enabled:

<?php
return [
    'modules' => [
        ...
        'Magento_Inventory' => 1,
        'Magento_InventoryAdminUi' => 1,
        'Magento_InventoryApi' => 1,
        'Magento_InventoryBundleProduct' => 1,
        'Magento_InventoryBundleProductAdminUi' => 1,
        'Magento_InventoryCatalog' => 1,
        'Magento_InventorySales' => 1,
        'Magento_InventoryCatalogAdminUi' => 1,
        'Magento_InventoryCatalogApi' => 1,
        'Magento_InventoryCatalogSearch' => 1,
        'Magento_InventoryConfigurableProduct' => 1,
        'Magento_InventoryConfigurableProductAdminUi' => 1,
        'Magento_InventoryConfigurableProductIndexer' => 1,
        'Magento_InventoryConfiguration' => 1,
        'Magento_InventoryConfigurationApi' => 1,
        'Magento_InventoryGroupedProduct' => 1,
        'Magento_InventoryGroupedProductAdminUi' => 1,
        'Magento_InventoryGroupedProductIndexer' => 1,
        'Magento_InventoryImportExport' => 1,
        'Magento_InventoryIndexer' => 1,
        'Magento_InventoryLowQuantityNotification' => 1,
        'Magento_InventoryLowQuantityNotificationAdminUi' => 1,
        'Magento_InventoryLowQuantityNotificationApi' => 1,
        'Magento_InventoryMultiDimensionalIndexerApi' => 1,
        'Magento_InventoryProductAlert' => 1,
        'Magento_InventoryReservations' => 1,
        'Magento_InventoryReservationsApi' => 1,
        'Magento_InventoryCache' => 1,
        'Magento_InventorySalesAdminUi' => 1,
        'Magento_InventorySalesApi' => 1,
        'Magento_InventorySalesFrontendUi' => 1,
        'Magento_InventoryShipping' => 1,
        'Magento_InventorySourceDeductionApi' => 1,
        'Magento_InventorySourceSelection' => 1,
        'Magento_InventorySourceSelectionApi' => 1,
        ...
    ]
];

Hello @minhluan259

I have followed this guide but I ran into the same problem. Can you tell me want exactly was the solution.

Thanks in advance Jens

EDIT:

Solution:

php bin/magento module:enable Magento_Inventory Magento_InventoryApi Magento_InventoryCatalogApi Magento_InventorySalesApi Magento_InventoryConfigurationApi Magento_InventoryReservationsApi Magento_InventorySourceDeductionApi Magento_SalesInventory Magento_InventorySales Magento_InventoryMultiDimensionalIndexerApi Magento_InventoryIndexer Magento_InventoryConfiguration Magento_InventoryCatalog Magento_InventoryReservations Magento_InventoryReservationsApi

Then you should be able to run setup:upgrade

Als described here https://github.com/Smile-SA/elasticsuite/issues/1243 by @joshmcoffman

@SolsWebdesign @paalsoberg

Here’s a patch I made to make Elasticsuite work without any MSI modules actually installed (so removed with the composer replace trick). Formatted for use with vaimo/composer-patches.

Removed dependency on MSI modules

@package smile/elasticsuite
@link https://github.com/Smile-SA/elasticsuite/issues/1222

diff --git src/module-elasticsuite-catalog/Model/Product/Indexer/Fulltext/Datasource/InventoryData.php src/module-elasticsuite-catalog/Model/Product/Indexer/Fulltext/Datasource/InventoryData.php
index ca4557d..f07e059 100644
--- src/module-elasticsuite-catalog/Model/Product/Indexer/Fulltext/Datasource/InventoryData.php
+++ src/module-elasticsuite-catalog/Model/Product/Indexer/Fulltext/Datasource/InventoryData.php
@@ -14,7 +14,6 @@
 namespace Smile\ElasticsuiteCatalog\Model\Product\Indexer\Fulltext\Datasource;

 use Smile\ElasticsuiteCore\Api\Index\DatasourceInterface;
-use Smile\ElasticsuiteCatalog\Model\ResourceModel\Product\Indexer\Fulltext\Datasource\InventoryDataInterface;
 use \Smile\ElasticsuiteCatalog\Model\ResourceModel\Product\Indexer\Fulltext\Datasource\Deprecation\InventoryData as Deprecation;

 /**
@@ -27,7 +26,7 @@ use \Smile\ElasticsuiteCatalog\Model\ResourceModel\Product\Indexer\Fulltext\Data
 class InventoryData implements DatasourceInterface
 {
     /**
-     * @var InventoryDataInterface
+     * @var Deprecation
      */
     private $resourceModel;

@@ -75,31 +74,15 @@ class InventoryData implements DatasourceInterface
     }

     /**
-     * Init proper resource model.
-     *
-     * Should be default implementation of InventoryDataInterface if MSI modules are enabled.
-     *
-     * Otherwise we fallback to old-style CatalogInventory indexing.
      *
      * @deprecated To be removed with Magento 2.4 and the dismantlement of legacy CatalogInventory module.
      *
-     * @return InventoryDataInterface
+     * @return Deprecation
      */
     private function getResourceModel()
     {
         if ($this->resourceModel === null) {
-            $resourceName = InventoryDataInterface::class;
-
-            try {
-                // Will try to fetch default implementation and fail in case of missing MSI modules or dependencies.
-                $stockResolver = $this->config->getPreference(\Magento\InventorySalesApi\Api\StockResolverInterface::class);
-                if (ltrim($stockResolver, '\\') === ltrim(\Magento\InventorySalesApi\Api\StockResolverInterface::class, '\\')) {
-                    $resourceName = Deprecation::class;
-                }
-            } catch (\Exception $exception) {
-                ; // Nothing to do, it's already kinda hacky to allow this deprecation fallback to happen.
-            }
-
+            $resourceName = Deprecation::class;
             $this->resourceModel = $this->objectManager->get($resourceName);
         }

diff --git src/module-elasticsuite-catalog/Model/ResourceModel/Product/Indexer/Fulltext/Datasource/InventoryData.php src/module-elasticsuite-catalog/Model/ResourceModel/Product/Indexer/Fulltext/Datasource/InventoryData.php
deleted file mode 100644
index 5ee7d1e..0000000
--- src/module-elasticsuite-catalog/Model/ResourceModel/Product/Indexer/Fulltext/Datasource/InventoryData.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-/**
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Smile ElasticSuite to newer
- * versions in the future.
- *
- * @category  Smile
- * @package   Smile\ElasticsuiteCatalog
- * @author    Romain Ruaud <romain.ruaud@smile.fr>
- * @copyright 2020 Smile
- * @license   Open Software License ("OSL") v. 3.0
- */
-namespace Smile\ElasticsuiteCatalog\Model\ResourceModel\Product\Indexer\Fulltext\Datasource;
-
-use Smile\ElasticsuiteCatalog\Model\ResourceModel\Eav\Indexer\Indexer;
-use Smile\ElasticsuiteCatalog\Model\ResourceModel\Product\Indexer\Fulltext\Datasource\InventoryDataInterface;
-use Magento\Framework\App\ResourceConnection;
-use Magento\Framework\EntityManager\MetadataPool;
-use Magento\Store\Model\StoreManagerInterface;
-use Magento\InventorySalesApi\Api\Data\SalesChannelInterface;
-use Magento\InventorySalesApi\Api\StockResolverInterface;
-use Magento\InventoryIndexer\Model\StockIndexTableNameResolverInterface;
-use Magento\InventoryIndexer\Indexer\IndexStructure;
-
-/**
- * Multi Source Inventory Catalog Inventory Data source resource model
- *
- * @category Smile
- * @package  Smile\ElasticsuiteCatalog
- * @author   Romain Ruaud <romain.ruaud@smile.fr>
- */
-class InventoryData extends Indexer implements InventoryDataInterface
-{
-    /**
-     * @var StockResolverInterface
-     */
-    private $stockResolver;
-
-    /**
-     * @var StockIndexTableNameResolverInterface
-     */
-    private $stockIndexTableProvider;
-
-    /**
-     * @var int[]
-     */
-    private $stockIdByWebsite = [];
-
-    /**
-     * InventoryData constructor.
-     *
-     * @param ResourceConnection                   $resource                Database adapter.
-     * @param StoreManagerInterface                $storeManager            Store manager.
-     * @param MetadataPool                         $metadataPool            Metadata Pool
-     * @param StockResolverInterface               $stockResolver           Stock resolver.
-     * @param StockIndexTableNameResolverInterface $stockIndexTableProvider Stock index table provider.
-     */
-    public function __construct(
-        ResourceConnection $resource,
-        StoreManagerInterface $storeManager,
-        MetadataPool $metadataPool,
-        StockResolverInterface $stockResolver,
-        StockIndexTableNameResolverInterface $stockIndexTableProvider
-    ) {
-        $this->stockResolver = $stockResolver;
-        $this->stockIndexTableProvider = $stockIndexTableProvider;
-
-        parent::__construct($resource, $storeManager, $metadataPool);
-    }
-
-    /**
-     * Load inventory data for a list of product ids and a given store.
-     * Expected rows structure : ['product_id', 'stock_status', 'qty'].
-     *
-     * @param integer $storeId    Store id.
-     * @param array   $productIds Product ids list.
-     *
-     * @return array
-     */
-    public function loadInventoryData($storeId, $productIds)
-    {
-        $websiteId = $this->getWebsiteId($storeId);
-        $stockId   = $this->getStockId($websiteId);
-        $tableName = $this->stockIndexTableProvider->execute($stockId);
-
-        $select = $this->getConnection()->select()
-            ->from(['product' => $this->getTable('catalog_product_entity')], [])
-            ->join(
-                ['stock_index' => $tableName],
-                'product.sku = stock_index.' . IndexStructure::SKU,
-                [
-                    'product_id'    => 'product.entity_id',
-                    'stock_status'  => 'stock_index.' . IndexStructure::IS_SALABLE,
-                    'qty'           => 'stock_index.' . IndexStructure::QUANTITY,
-                ]
-            )
-            ->where('product.entity_id IN (?)', $productIds)
-            ->group('product.entity_id');
-
-        return $this->getConnection()->fetchAll($select);
-    }
-
-    /**
-     * Retrieve stock_id by website
-     *
-     * @param int $websiteId The website Id
-     *
-     * @return int
-     */
-    private function getStockId($websiteId)
-    {
-        if (!isset($this->stockIdByWebsite[$websiteId])) {
-            $websiteCode = $this->storeManager->getWebsite($websiteId)->getCode();
-            $stock = $this->stockResolver->execute(SalesChannelInterface::TYPE_WEBSITE, $websiteCode);
-            $stockId = (int) $stock->getStockId();
-            $this->stockIdByWebsite[$websiteId] = $stockId;
-        }
-
-        return $this->stockIdByWebsite[$websiteId];
-    }
-
-    /**
-     * Retrieve Website Id by Store Id
-     *
-     * @param int $storeId The store id
-     *
-     * @return int
-     */
-    private function getWebsiteId($storeId)
-    {
-        return $this->storeManager->getStore($storeId)->getWebsiteId();
-    }
-}
diff --git src/module-elasticsuite-catalog/etc/di.xml src/module-elasticsuite-catalog/etc/di.xml
index 8121b1d..67d6ff0 100644
--- src/module-elasticsuite-catalog/etc/di.xml
+++ src/module-elasticsuite-catalog/etc/di.xml
@@ -275,9 +275,6 @@
         </arguments>
     </type>

-    <preference for="Smile\ElasticsuiteCatalog\Model\ResourceModel\Product\Indexer\Fulltext\Datasource\InventoryDataInterface"
-                type="Smile\ElasticsuiteCatalog\Model\ResourceModel\Product\Indexer\Fulltext\Datasource\InventoryData" />
-
     <virtualType name="Smile\ElasticsuiteCatalog\Search\Request\Product\Coverage\Builder"
         type="\Smile\ElasticsuiteCore\Search\Request\Builder">
         <arguments>

Hello Guys,

Anyone have a news about this issue ?

Thank’s

This seems to be related to your installation. Magento\InventorySalesApi\Api\StockResolverInterface should be available in vendor/magento/module-inventory-sales-api/Api/StockResolverInterface.php on a Magento 2.3 installation (and mapped in vendor/magento/module-inventory-sales/etc/di.xml to <preference for="Magento\InventorySalesApi\Api\StockResolverInterface" type="Magento\InventorySales\Model\StockResolver"/>.

We’ve had the same ‘issue’ but it was due to the fact that we had removed the magento/module-inventory-sales-api using composer replace. Could also be related to the generated folder or old cache.

Hello @paalsoberg,

2.7.7 and 2.8.0 releases introduced a fix that should allow you to use either the MSI modules or the legacy cataloginventory module. Unless you’re using PHP 7.3 which does not like a particular return type annotation : this is to be addressed in our (very soon) incoming 2.8.3 release.

Regards,