<?php
declare(strict_types=1);
namespace App\Module\Checkout\Subscriber;
use App\Module\Checkout\Provider\CartProvider;
use App\Module\ShortSimpleCheckout\Controller\ConfirmController;
use App\Module\ShortSimpleCheckout\Controller\Facade\CustomFieldControllerFacadeInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* Writes data like customer comment and customer reference into custom fields of the cart before validation
*
* @author André Varelmann <andre.varelmann@bestit-online.de>
* @package App\Module\Checkout\Subscriber
*/
class CartCustomFieldSubscriber implements EventSubscriberInterface
{
private CartProvider $cartProvider;
private CustomFieldControllerFacadeInterface $customFieldControllerFacade;
/**
* @param CartProvider $cartProvider
* @param CustomFieldControllerFacadeInterface $customFieldControllerFacade
*/
public function __construct(
CartProvider $cartProvider,
CustomFieldControllerFacadeInterface $customFieldControllerFacade
) {
$this->cartProvider = $cartProvider;
$this->customFieldControllerFacade = $customFieldControllerFacade;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
// priority 999 to do this before the validators
return [KernelEvents::CONTROLLER => ['onKernelController', 999]];
}
/**
* @param ControllerEvent $event
*
* @return void
*/
public function onKernelController(ControllerEvent $event): void
{
$controller = $event->getController();
if (!is_array($controller)) {
return;
}
$controller = $controller[0];
$request = $event->getRequest();
if (get_class($controller) === ConfirmController::class
&& ($request->request->has('customerComment') || $request->request->has('customerReference'))
) {
$this->customFieldControllerFacade->setCart(
[
'customerComment' => $request->request->get('customerComment'),
'customerReference' => $request->request->get('customerReference'),
],
$this->cartProvider->getCart()
);
}
}
}