diff --git a/src/Controller/Booking/Create/IndexController.php b/src/Controller/Booking/Create/IndexController.php
index fef1626..21c2f57 100644
--- a/src/Controller/Booking/Create/IndexController.php
+++ b/src/Controller/Booking/Create/IndexController.php
@@ -11,6 +11,7 @@ use App\Exception\NoRoomsAvailableException;
use App\Exception\TravelNotFoundException;
use App\Htmx\HxTrait;
use App\Service\BookingService;
+use App\Service\BookingSummaryDataService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -30,6 +31,7 @@ class IndexController extends AbstractController
public function __construct(
private readonly BookingService $bookingService,
private readonly AgencyLoader $agencyLoader,
+ private readonly BookingSummaryDataService $summaryDataService,
) {
}
@@ -63,7 +65,13 @@ class IndexController extends AbstractController
$this->bookingService->storeReturnUrl($request, $request->query->get('r'));
// Create fresh booking session with the provided parameters
- $this->bookingService->startFreshBooking($request, $dateId, $hotelId, $agencyId);
+ $bookingDto = $this->bookingService->startFreshBooking($request, $dateId, $hotelId, $agencyId);
+
+ // Warm the CMS cache early so data is available on the login page
+ $this->summaryDataService->getCmsDataForProduct(
+ $bookingDto->travel->productCode,
+ $bookingDto->travel->hotel?->code
+ );
// Redirect to login page (optional authentication before Step 1)
return $this->redirectToRoute('app_login');
diff --git a/src/Controller/SecurityController.php b/src/Controller/SecurityController.php
index ca91152..cf96230 100644
--- a/src/Controller/SecurityController.php
+++ b/src/Controller/SecurityController.php
@@ -3,6 +3,7 @@
namespace App\Controller;
use App\Service\BookingService;
+use App\Service\BookingSummaryDataService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -14,8 +15,12 @@ class SecurityController extends AbstractController
{
#[Route('/', name: 'app_login')]
#[IsGranted('PUBLIC_ACCESS')]
- public function login(AuthenticationUtils $authenticationUtils, Request $request, BookingService $bookingService): Response
- {
+ public function login(
+ AuthenticationUtils $authenticationUtils,
+ Request $request,
+ BookingService $bookingService,
+ BookingSummaryDataService $summaryDataService,
+ ): Response {
// Check if this is a booking flow (BookingDto exists in session)
$bookingDto = $bookingService->getBookingDto($request, BookingService::BOOKING_CREATE_KEY);
$isBookingFlow = null !== $bookingDto;
@@ -50,12 +55,22 @@ class SecurityController extends AbstractController
// Render booking login template if in booking flow, otherwise standard login
$template = true === $isBookingFlow ? 'booking/create/authenticate.html.twig' : 'security/login.html.twig';
+ // Fetch CMS data for booking flow (uses cache warmed in IndexController)
+ $cmsData = null;
+ if (true === $isBookingFlow) {
+ $cmsData = $summaryDataService->getCmsDataForProduct(
+ $bookingDto->travel->productCode,
+ $bookingDto->travel->hotel?->code
+ );
+ }
+
return $this->render($template, [
'last_username' => $lastUsername,
'error' => $error,
'travel_title' => $bookingDto?->travel->label,
'travel_date_from' => $bookingDto?->travel->dateFrom,
'travel_date_to' => $bookingDto?->travel->dateTo,
+ 'cmsData' => $cmsData,
]);
}
diff --git a/src/Service/BookingSummaryDataService.php b/src/Service/BookingSummaryDataService.php
index 1e2aaa7..635c3c3 100644
--- a/src/Service/BookingSummaryDataService.php
+++ b/src/Service/BookingSummaryDataService.php
@@ -128,21 +128,15 @@ class BookingSummaryDataService
}
/**
- * Fetches CMS data for the product and hotel in the booking.
+ * Fetches CMS data for a product and hotel combination.
*
* Data is cached for 1 hour as it rarely changes. Returns null
- * if the API call fails or if product/hotel codes are not available.
+ * if the API call fails or if product code is not available.
+ * This method can be called early in the booking flow to warm the cache.
*/
- private function getCmsData(BookingDto $bookingDto): ?array
+ public function getCmsDataForProduct(?string $productCode, ?string $hotelCode): ?array
{
- $productCode = $bookingDto->travel->productCode;
- $hotelCode = $bookingDto->travel->hotel?->code;
-
if (null === $productCode) {
- $this->logger->debug('Cannot fetch CMS data: product code is not available', [
- 'travel_id' => $bookingDto->travel->id,
- ]);
-
return null;
}
@@ -177,4 +171,23 @@ class BookingSummaryDataService
return null;
}
}
+
+ /**
+ * Fetches CMS data for the product and hotel in the booking.
+ */
+ private function getCmsData(BookingDto $bookingDto): ?array
+ {
+ $productCode = $bookingDto->travel->productCode;
+ $hotelCode = $bookingDto->travel->hotel?->code;
+
+ if (null === $productCode) {
+ $this->logger->debug('Cannot fetch CMS data: product code is not available', [
+ 'travel_id' => $bookingDto->travel->id,
+ ]);
+
+ return null;
+ }
+
+ return $this->getCmsDataForProduct($productCode, $hotelCode);
+ }
}
diff --git a/templates/booking/create/authenticate.html.twig b/templates/booking/create/authenticate.html.twig
index 11e683f..5bb0eb1 100644
--- a/templates/booking/create/authenticate.html.twig
+++ b/templates/booking/create/authenticate.html.twig
@@ -9,10 +9,16 @@
Neue
Buchung
-