<?php
namespace App\EventSubscriber;
use App\Entity\DeregistrationFormReview;
use App\Entity\Form;
use App\Entity\FormSupportTicket;
use App\Entity\InspectionFormReview;
use App\Entity\RegistrationFormReview;
use App\Entity\RenewalFormReview;
use App\Entity\SupportTicket;
use App\Event\AppEvents;
use App\Event\FormEvent;
use App\Event\FormsDeletedEvent;
use App\Event\PropertyEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class FormSubscriber implements EventSubscriberInterface
{
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(
EntityManagerInterface $entityManager,
EventDispatcherInterface $eventDispatcher
) {
$this->eventDispatcher = $eventDispatcher;
$this->entityManager = $entityManager;
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return [
AppEvents::PROPERTY_DELETED => ['onPropertyDeleted'],
AppEvents::FORM_DELETED => ['onFormDeleted']
];
}
public function onFormDeleted(FormEvent $event)
{
$form = $event->getForm();
$this->deleteFormsRelation([$form->getId()]);
}
/**
* @param PropertyEvent $event
*/
public function onPropertyDeleted(PropertyEvent $event)
{
$property = $event->getProperty();
$id = $property->getId();
//Delete Forms from this property.
$formIds = $this->entityManager->getRepository(Form::class)->deleteByProperty($id);
if (count($formIds)) {
$this->deleteFormsRelation($formIds);
}
}
/**
* @param $formIds
*/
private function deleteFormsRelation($formIds)
{
//Delete Forms Reviews.
$this->entityManager->getRepository(DeregistrationFormReview::class)->deleteInIds($formIds);
$this->entityManager->getRepository(InspectionFormReview::class)->deleteInIds($formIds);
$this->entityManager->getRepository(RegistrationFormReview::class)->deleteInIds($formIds);
$this->entityManager->getRepository(RenewalFormReview::class)->deleteInIds($formIds);
//Delete Forms Dispute and Support.
$formTicketIds = $this->entityManager->getRepository(FormSupportTicket::class)->getTicketsInIds($formIds);
if (count($formTicketIds)) {
$this->entityManager->getRepository(SupportTicket::class)->deleteInIds($formTicketIds);
}
$this->eventDispatcher->dispatch(new FormsDeletedEvent($formIds), AppEvents::FORMS_DELETED);
}
}