<?php
declare(strict_types=1);
namespace App\EventListener\Questionary;
use App\Entity\QuestionaryAttempt;
use App\Event\Questionary\TestFailedEvent;
use App\Repository\QuestionaryRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class TestFailedListener
{
private QuestionaryRepository $questionaryRepository;
private EntityManagerInterface $em;
private SessionInterface $session;
private RequestStack $requestStack;
private TranslatorInterface $translator;
public function __construct(QuestionaryRepository $questionaryRepository,
EntityManagerInterface $em,
SessionInterface $session,
RequestStack $requestStack,
TranslatorInterface $translator
) {
$this->questionaryRepository = $questionaryRepository;
$this->em = $em;
$this->session = $session;
$this->requestStack = $requestStack;
$this->translator = $translator;
}
public function onTestFailed(TestFailedEvent $event): void
{
$attempt = $event->getTestAttempt();
if(null === $attempt) {
return;
}
$questionary = $this->questionaryRepository->findLastActiveByEvent(TestFailedEvent::class);
if ($questionary === null) {
return;
}
$questionaryAttempt = new QuestionaryAttempt();
$questionaryAttempt->setStudent($event->getTestAttempt()->getStudent());
$questionaryAttempt->setIsDone(false);
$questionaryAttempt->setQuestionary($questionary);
$questionaryAttempt->setTitle($event->getTestAttempt()->getTest()->getTitle());
$this->em->persist($questionaryAttempt);
$this->em->flush();
$request = $this->requestStack->getCurrentRequest();
if ($request->hasSession()) {
$this->session->getFlashBag()->add(
'notice',
$this->translator->trans('event.questionary_activated', [], 'admin_questionary')
);
}
}
}