src/Twig/Cruise/CruiseExtension.php line 86

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Twig\Cruise;
  4. use App\Helper\Cruise\CruiseHelper;
  5. use App\Repository\Cruise\CruiseRepository;
  6. use Crea\MediaBundle\Entity\MediaFile;
  7. use Croisiland\CommonBundle\Constants\Cruise\CruiseConstants;
  8. use Croisiland\CommonBundle\Entity\Cruise\Cruise;
  9. use Croisiland\CommonBundle\Entity\Itinerary\Itinerary;
  10. use DateMalformedStringException;
  11. use Doctrine\Common\Collections\Collection;
  12. use Doctrine\ORM\NonUniqueResultException;
  13. use Doctrine\ORM\NoResultException;
  14. use Random\RandomException;
  15. use Twig\Extension\AbstractExtension;
  16. use Twig\TwigFunction;
  17. class CruiseExtension extends AbstractExtension
  18. {
  19. /** @var array<int, Cruise|null> */
  20. private array $cacheById = [];
  21. public function __construct(
  22. private readonly CruiseRepository $cruiseRepository,
  23. private readonly CruiseHelper $cruiseHelper,
  24. ) {
  25. }
  26. /**
  27. * @return TwigFunction[]
  28. */
  29. public function getFunctions(): array
  30. {
  31. return [
  32. new TwigFunction('getCruiseById', $this->getCruiseById(...)),
  33. new TwigFunction('getUpcomingCruises', $this->getUpcomingCruises(...)),
  34. new TwigFunction('searchCruises', $this->searchCruises(...)),
  35. new TwigFunction('getCruiseSearchUrl', $this->getCruiseSearchUrl(...)),
  36. ];
  37. }
  38. public function getCruiseById(int $id): ?Cruise
  39. {
  40. if (!array_key_exists($id, $this->cacheById)) {
  41. $this->cacheById[$id] = $this->cruiseRepository->findForDdd($id);
  42. }
  43. return $this->cacheById[$id];
  44. }
  45. /**
  46. * @throws DateMalformedStringException
  47. */
  48. public function getUpcomingCruises(Itinerary $itinerary): Collection
  49. {
  50. return $this->cruiseRepository->getUpcomingCruises($itinerary, CruiseConstants::DATETIME_INTERVAL_NEXT_DEPARTURES);
  51. }
  52. /**
  53. * @param array<object> $searchElements available objects : Companies, Ship, Tags, Partner,
  54. * @param int $limit
  55. * @param bool $random
  56. * @return Cruise[]
  57. *
  58. * @throws NoResultException
  59. * @throws NonUniqueResultException
  60. */
  61. private function searchCruises(array $searchElements, int $limit = 5, bool $random = false): array
  62. {
  63. return $this->cruiseHelper->searchCruises($searchElements, $limit, $random);
  64. }
  65. /**
  66. * @param array<object> $searchElements available objects : Companies, Ship, Tags, Partner,
  67. * @param string|null $locale Locale. Si null, utilise la locale actuelle.
  68. * @param string|null $webspaceKey Clé du webspace. Si null, utilise le webspace actuel.
  69. * @param string|null $domain Domaine personnalisé. Si null, utilise le domaine actuel.
  70. * @param string|null $scheme Schéma (ex: 'https'). Si null, utilise le schéma actuel.
  71. * @param bool $withoutDomain Si true, retourne une URL relative (sans domaine).
  72. *
  73. * @return string URL générée avec paramètres GET.
  74. */
  75. private function getCruiseSearchUrl(array $searchElements,
  76. ?string $locale = null,
  77. ?string $webspaceKey = null,
  78. ?string $domain = null,
  79. ?string $scheme = null,
  80. bool $withoutDomain = true): string
  81. {
  82. return $this->cruiseHelper->getCruiseSearchUrl($searchElements, $locale, $webspaceKey, $domain, $scheme, $withoutDomain);
  83. }
  84. }