src/Controller/Front/Exercise/ShowController.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front\Exercise;
  3. use App\Entity\Account\User;
  4. use App\Entity\Exercise\Exercise;
  5. use App\Entity\Scholar\Lesson\Lesson;
  6. use App\Entity\Scholar\Module\Module;
  7. use App\Entity\Scholar\Training\Training;
  8. use App\Repository\Exercise\User\ExerciseResultRepository;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. class ShowController extends AbstractController
  16. {
  17. public function __construct(
  18. private ExerciseResultRepository $exerciseResultRepository,
  19. )
  20. {
  21. }
  22. #[Route(path: '/training/{trainingId}/module/{moduleId}/lesson/{lessonId}/exercise/{exerciseId}', name: 'front_channel_exercise_show', methods: ['GET'])]
  23. #[ParamConverter('training', options: ['id' => 'trainingId'])]
  24. #[ParamConverter('module', options: ['id' => 'moduleId'])]
  25. #[ParamConverter('lesson', options: ['id' => 'lessonId'])]
  26. #[ParamConverter('exercise', options: ['id' => 'exerciseId'])]
  27. public function __invoke(Request $request, Training $training, Module $module, Lesson $lesson, Exercise $exercise): Response
  28. {
  29. if (!$this->isGranted('FRONT_ACCESS', [
  30. 'training' => $training,
  31. 'module' => $module,
  32. 'lesson' => $lesson,
  33. ])) {
  34. throw $this->createAccessDeniedException();
  35. }
  36. /** @var ?User $user */
  37. $user = $this->getUser();
  38. $bestExerciseResult = $user === null ? null : $this->exerciseResultRepository->findBestExerciseResultForUserAndExercise($user, $exercise);
  39. if (
  40. $exercise->getLesson() !== $lesson
  41. ) {
  42. throw new NotFoundHttpException();
  43. }
  44. return $this->render('Front/Exercise/show.html.twig', [
  45. 'training' => $training,
  46. 'module' => $module,
  47. 'lesson' => $lesson,
  48. 'current_exercise' => $exercise,
  49. 'bestExerciseResult' => $bestExerciseResult,
  50. 'channel' => $training->getOwnerChannel(),
  51. ]);
  52. }
  53. }