<?php
namespace App\EventSubscriber\ECommerce;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\ECommerce\Currency;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use App\Entity\ECommerce\Client;
use App\Entity\ECommerce\Firm;
use Doctrine\ORM\Events;
/**
* Class ClientSubscriber
*
* @package App\EventSubscriber\ECommerce
*/
class ClientSubscriber implements EventSubscriberInterface
{
/**
* @var EntityManagerInterface
*/
protected $entityManager;
/**
* ClientSubscriber constructor.
*
* @param EntityManagerInterface $entityManager
*/
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return array(
Events::postLoad => 'postLoad',
Events::prePersist => 'prePersist',
);
}
/**
* @param LifecycleEventArgs $args
*/
public function postLoad(LifecycleEventArgs $args)
{
$this->checkFirm($args);
}
/**
* @param LifecycleEventArgs $args
*/
public function prePersist(LifecycleEventArgs $args)
{
$this->checkFirm($args);
$this->checkCurrency($args);
}
/**
* @param LifecycleEventArgs $args
*/
protected function checkCurrency(LifecycleEventArgs $args)
{
$client = $args->getObject();
if (!$client instanceof Client) {
return;
}
$client->setCurrency($this->entityManager->getRepository(Currency::class)->findFirst());
}
/**
* @param LifecycleEventArgs $args
*/
protected function checkFirm(LifecycleEventArgs $args)
{
$client = $args->getObject();
if (!$client instanceof Client) {
return;
}
$this->setFirm($client);
}
/**
* @param Client $client
*/
public function setFirm(Client $client)
{
if ($client->getFirm() instanceof Firm) {
return $client;
}
$firm = $this->entityManager->getRepository(Firm::class)->findOneByCurrency($client->getCurrency());
return $client->setFirm($firm);
}
}