Im sorry to call such attention to this question but there's a TON wrong here. Hopefully, you will take some lessons away from this answer.
- Don't use the Object Manager in your code
- Don't get the quote from the session. But IF you insist, you should probably use
$objectManager->get('class name') not $objectManager->create('class name'). Get ensures that you get a shared instance of the class. Create instantiates a new instance of the class. - Don't override getAllVisibleItems - not sure what your purpose is for that but you WILL make trouble for yourself. Plugins are immediately available for your use and are a MUCH better choice. Also, getAllVisible items doesnt account for the child products if the customer has grouped, bundle, or configurable products. It really only accounts for the visible line items.
- DO get used to looking at the Interfaces and using the methods contained in the interfaces only. Interfaces are basically a set of promises to provide the functions you are using. Referencing functions from concrete PHP classes will render your functionality broken during some future upgrade.
Here is a working example. We don't reference the session or object manager and we use only methods available according to the service contract. Work this into your code and test it out.
<?php class CartTest { /** * @var \Magento\Quote\Api\CartItemRepositoryInterface */ private $repository; /** * CartTest constructor. * * @param \Magento\Quote\Api\CartItemRepositoryInterface $repository */ public function __construct( \Magento\Quote\Api\CartItemRepositoryInterface $repository ) { $this->repository = $repository; } /** * @param int $cartId * * @return $this * @throws \Magento\Framework\Exception\CouldNotSaveException * @throws \Magento\Framework\Exception\NoSuchEntityException */ public function emptyCart($cartId) { /** * gets all items belonging to the cart */ $items = $this->repository->getList($cartId); foreach ($items as $item) { $this->repository->deleteById($cartId, $item->getItemId()); } return $this; } }