diff --git a/vendor/magento/module-quote/Model/Quote/Plugin/UpdateQuoteStoreId.php b/vendor/magento/module-quote/Model/Quote/Plugin/UpdateQuoteStoreId.php index bffa0084e35..ad1880a0545 100644 --- a/vendor/magento/module-quote/Model/Quote/Plugin/UpdateQuoteStoreId.php +++ b/vendor/magento/module-quote/Model/Quote/Plugin/UpdateQuoteStoreId.php @@ -8,7 +8,9 @@ declare(strict_types=1); namespace Magento\Quote\Model\Quote\Plugin; use Magento\Quote\Model\Quote; +use Magento\Store\Api\Data\StoreInterface; use Magento\Store\Model\StoreManagerInterface; +use Magento\Framework\App\Request\Http as Request; /** * Updates quote store id. @@ -20,17 +22,25 @@ class UpdateQuoteStoreId */ private $storeManager; + /** + * @var Request + */ + private $request; + /** * @param StoreManagerInterface $storeManager + * @param Request $request */ public function __construct( - StoreManagerInterface $storeManager + StoreManagerInterface $storeManager, + Request $request ) { $this->storeManager = $storeManager; + $this->request = $request; } /** - * Update store id in requested quote by store id from request. + * Update store id in requested quote by store id from guest's request. * * @param Quote $subject * @param Quote $result @@ -39,11 +49,51 @@ class UpdateQuoteStoreId */ public function afterLoadByIdWithoutStore(Quote $subject, Quote $result): Quote { - $storeId = $this->storeManager->getStore() - ->getId() ?: $this->storeManager->getDefaultStoreView() - ->getId(); - $result->setStoreId($storeId); + return $this->updateStoreId($result); + } + + /** + * Update store id in requested quote by store id from registered customer's request. + * + * @param Quote $subject + * @param Quote $result + * @return Quote + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function afterLoadByCustomer(Quote $subject, Quote $result): Quote + { + return $this->updateStoreId($result); + } + + /** + * Returns store based on web-api request path. + * + * @param string $requestPath + * @return StoreInterface|null + */ + private function getStore(string $requestPath): ?StoreInterface + { + $pathParts = explode('/', trim($requestPath, '/')); + array_shift($pathParts); + $storeCode = current($pathParts); + $stores = $this->storeManager->getStores(false, true); + + return $stores[$storeCode] ?? null; + } + + /** + * Update store id in requested quote by store id from request. + * + * @param Quote $quote + * @return Quote + */ + private function updateStoreId(Quote $quote): Quote + { + $store = $this->getStore($this->request->getPathInfo()); + if ($store) { + $quote->setStoreId($store->getId()); + } - return $result; + return $quote; } }