53
53
*/
54
54
class QuoteManagement implements CartManagementInterface, ResetAfterRequestInterface
55
55
{
56
- private const LOCK_PREFIX = 'PLACE_ORDER_ ' ;
57
-
58
- private const LOCK_TIMEOUT = 0 ;
59
-
60
56
/**
61
57
* @var EventManager
62
58
*/
@@ -157,11 +153,6 @@ class QuoteManagement implements CartManagementInterface, ResetAfterRequestInter
157
153
*/
158
154
protected $ quoteFactory ;
159
155
160
- /**
161
- * @var LockManagerInterface
162
- */
163
- private $ lockManager ;
164
-
165
156
/**
166
157
* @var QuoteIdMaskFactory
167
158
*/
@@ -187,6 +178,11 @@ class QuoteManagement implements CartManagementInterface, ResetAfterRequestInter
187
178
*/
188
179
private $ remoteAddress ;
189
180
181
+ /**
182
+ * @var CartMutexInterface
183
+ */
184
+ private $ cartMutex ;
185
+
190
186
/**
191
187
* @param EventManager $eventManager
192
188
* @param SubmitQuoteValidator $submitQuoteValidator
@@ -211,9 +207,11 @@ class QuoteManagement implements CartManagementInterface, ResetAfterRequestInter
211
207
* @param QuoteIdMaskFactory|null $quoteIdMaskFactory
212
208
* @param AddressRepositoryInterface|null $addressRepository
213
209
* @param RequestInterface|null $request
214
- * @param RemoteAddress $remoteAddress
210
+ * @param RemoteAddress|null $remoteAddress
215
211
* @param LockManagerInterface $lockManager
212
+ * @param CartMutexInterface|null $cartMutex
216
213
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
214
+ * @SuppressWarnings(PHPMD.UnusedFormalParameter)
217
215
*/
218
216
public function __construct (
219
217
EventManager $ eventManager ,
@@ -240,7 +238,8 @@ public function __construct(
240
238
AddressRepositoryInterface $ addressRepository = null ,
241
239
RequestInterface $ request = null ,
242
240
RemoteAddress $ remoteAddress = null ,
243
- LockManagerInterface $ lockManager = null
241
+ LockManagerInterface $ lockManager = null ,
242
+ ?CartMutexInterface $ cartMutex = null
244
243
) {
245
244
$ this ->eventManager = $ eventManager ;
246
245
$ this ->submitQuoteValidator = $ submitQuoteValidator ;
@@ -270,8 +269,8 @@ public function __construct(
270
269
->get (RequestInterface::class);
271
270
$ this ->remoteAddress = $ remoteAddress ?: ObjectManager::getInstance ()
272
271
->get (RemoteAddress::class);
273
- $ this ->lockManager = $ lockManager ?: ObjectManager:: getInstance ()
274
- ->get (LockManagerInterface ::class);
272
+ $ this ->cartMutex = $ cartMutex
273
+ ?? ObjectManager:: getInstance () ->get (CartMutexInterface ::class);
275
274
}
276
275
277
276
/**
@@ -397,10 +396,28 @@ protected function createCustomerCart($customerId, $storeId)
397
396
398
397
/**
399
398
* @inheritdoc
399
+ */
400
+ public function placeOrder ($ cartId , PaymentInterface $ paymentMethod = null )
401
+ {
402
+ return $ this ->cartMutex ->execute (
403
+ (int )$ cartId ,
404
+ \Closure::fromCallable ([$ this , 'placeOrderRun ' ]),
405
+ [$ cartId , $ paymentMethod ]
406
+ );
407
+ }
408
+
409
+ /**
410
+ * Places an order for a specified cart.
411
+ *
412
+ * @param int $cartId The cart ID.
413
+ * @param PaymentInterface|null $paymentMethod
414
+ * @throws CouldNotSaveException
415
+ * @return int Order ID.
400
416
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
401
417
* @SuppressWarnings(PHPMD.NPathComplexity)
418
+ * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
402
419
*/
403
- public function placeOrder ($ cartId , PaymentInterface $ paymentMethod = null )
420
+ private function placeOrderRun ($ cartId , PaymentInterface $ paymentMethod = null )
404
421
{
405
422
$ quote = $ this ->quoteRepository ->getActive ($ cartId );
406
423
$ customer = $ quote ->getCustomer ();
@@ -614,12 +631,6 @@ protected function submitQuote(QuoteEntity $quote, $orderData = [])
614
631
]
615
632
);
616
633
617
- $ lockedName = self ::LOCK_PREFIX . $ quote ->getId ();
618
- if (!$ this ->lockManager ->lock ($ lockedName , self ::LOCK_TIMEOUT )) {
619
- throw new LocalizedException (__ (
620
- 'A server error stopped your order from being placed. Please try to place your order again. '
621
- ));
622
- }
623
634
try {
624
635
$ order = $ this ->orderManagement ->place ($ order );
625
636
$ quote ->setIsActive (false );
@@ -632,7 +643,6 @@ protected function submitQuote(QuoteEntity $quote, $orderData = [])
632
643
);
633
644
$ this ->quoteRepository ->save ($ quote );
634
645
} catch (\Exception $ e ) {
635
- $ this ->lockManager ->unlock ($ lockedName );
636
646
$ this ->rollbackAddresses ($ quote , $ order , $ e );
637
647
throw $ e ;
638
648
}
0 commit comments