<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Sylius\Bundle\CoreBundle\EventListener;
use Doctrine\Common\Persistence\ObjectManager;
use Sylius\Bundle\UserBundle\Event\UserEvent;
use Sylius\Component\Core\Model\OrderInterface;
use Sylius\Component\Core\Model\ShopUserInterface;
use Sylius\Component\Order\Context\CartContextInterface;
use Sylius\Component\Order\Context\CartNotFoundException;
use Sylius\Component\Resource\Exception\UnexpectedTypeException;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
final class CartBlamerListener
{
/** @var ObjectManager */
private $cartManager;
/** @var CartContextInterface */
private $cartContext;
public function __construct(ObjectManager $cartManager, CartContextInterface $cartContext)
{
$this->cartManager = $cartManager;
$this->cartContext = $cartContext;
}
public function onImplicitLogin(UserEvent $userEvent): void
{
$user = $userEvent->getUser();
if (!$user instanceof ShopUserInterface) {
return;
}
$this->blame($user);
}
public function onInteractiveLogin(InteractiveLoginEvent $interactiveLoginEvent): void
{
$user = $interactiveLoginEvent->getAuthenticationToken()->getUser();
if (!$user instanceof ShopUserInterface) {
return;
}
$this->blame($user);
}
private function blame(ShopUserInterface $user): void
{
$cart = $this->getCart();
if (null === $cart) {
return;
}
$cart->setCustomer($user->getCustomer());
$this->cartManager->persist($cart);
$this->cartManager->flush();
}
/**
* @throws UnexpectedTypeException
*/
private function getCart(): ?OrderInterface
{
try {
$cart = $this->cartContext->getCart();
} catch (CartNotFoundException $exception) {
return null;
}
if (!$cart instanceof OrderInterface) {
throw new UnexpectedTypeException($cart, OrderInterface::class);
}
return $cart;
}
}