createForm(SelectSeasonType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $seasonCode = $form->get('season_code')->getData(); if ([] === $seasonRepository->findBy(['seasonCode' => $seasonCode])) { $this->addFlash(FlashType::Warning, $this->translator->trans('Invalid season code')); return $this->redirectToRoute('app_quiz_select_season'); } return $this->redirectToRoute('app_quiz_enter_name', ['seasonCode' => $seasonCode]); } return $this->render('quiz/select_season.html.twig', ['form' => $form]); } #[Route(path: '/{seasonCode:season}', name: 'app_quiz_enter_name', requirements: ['seasonCode' => self::SEASON_CODE_REGEX])] public function enterName( Request $request, Season $season, ): Response { $form = $this->createForm(EnterNameType::class); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $name = $form->get('name')->getData(); return $this->redirectToRoute('app_quiz_quiz_page', ['seasonCode' => $season->getSeasonCode(), 'nameHash' => Base64::base64UrlEncode($name)]); } return $this->render('quiz/enter_name.twig', ['season' => $season, 'form' => $form]); } #[Route( path: '/{seasonCode:season}/{nameHash}', name: 'app_quiz_quiz_page', requirements: ['seasonCode' => self::SEASON_CODE_REGEX, 'nameHash' => self::CANDIDATE_HASH_REGEX], )] public function quizPage( Season $season, string $nameHash, Request $request, CandidateRepository $candidateRepository, QuestionRepository $questionRepository, AnswerRepository $answerRepository, GivenAnswerRepository $givenAnswerRepository, QuizCandidateRepository $quizCandidateRepository, ): Response { $candidate = $candidateRepository->getCandidateByHash($season, $nameHash); if (!$candidate instanceof Candidate) { $this->addFlash(FlashType::Danger, $this->translator->trans('Candidate not found')); return $this->redirectToRoute('app_quiz_enter_name', ['seasonCode' => $season->getSeasonCode()]); } $quiz = $season->getActiveQuiz(); if (!$quiz instanceof Quiz) { $this->addFlash(FlashType::Warning, $this->translator->trans('There is no active quiz')); return $this->redirectToRoute('app_quiz_enter_name', ['seasonCode' => $season->getSeasonCode()]); } if ('POST' === $request->getMethod()) { $answer = $answerRepository->findOneBy(['id' => $request->request->get('answer')]); if (!$answer instanceof Answer) { throw new BadRequestHttpException('Invalid Answer ID'); } $givenAnswer = new GivenAnswer($candidate, $answer->getQuestion()->getQuiz(), $answer); $givenAnswerRepository->save($givenAnswer); return $this->redirectToRoute('app_quiz_quiz_page', ['seasonCode' => $season->getSeasonCode(), 'nameHash' => $nameHash]); } $question = $questionRepository->findNextQuestionForCandidate($candidate); if (!$question instanceof Question) { $this->addFlash(FlashType::Success, $this->translator->trans('Quiz completed')); return $this->redirectToRoute('app_quiz_enter_name', ['seasonCode' => $season->getSeasonCode()]); } $quizCandidateRepository->createIfNotExist($quiz, $candidate); return $this->render('quiz/question.twig', ['candidate' => $candidate, 'question' => $question, 'season' => $season]); } }