From 9e70e04f068c677c20aa0becb98ca144517be279 Mon Sep 17 00:00:00 2001 From: Ambroise Maupate Date: Tue, 13 Feb 2024 20:16:19 +0100 Subject: [PATCH] feat: Improved *locale* management by storing `_translation` into Request attributes during LocaleSubscriber --- .../src/Controller/Controller.php | 22 ---- .../src/Controller/FrontendController.php | 6 +- .../MaintenanceModeSubscriber.php | 26 +--- .../GetWebResponseByPathController.php | 7 ++ .../TranslationAwareControllerTrait.php | 5 + .../src/Controller/CustomFormController.php | 112 +++--------------- .../src/EventSubscriber/LocaleSubscriber.php | 63 ++++++++-- .../EventSubscriber/NodeNameSubscriber.php | 1 - .../NodeRedirectionSubscriber.php | 1 - .../NodesSourcesUniversalSubscriber.php | 1 - .../NodesSourcesUrlsCacheEventSubscriber.php | 11 -- .../OPCacheEventSubscriber.php | 1 - .../ReverseProxyCacheEventSubscriber.php | 2 - .../src/EventSubscriber/RoleSubscriber.php | 3 - .../EventSubscriber/TranslationSubscriber.php | 3 - .../EventSubscriber/UserLocaleSubscriber.php | 1 - .../Normalizer/TranslationAwareNormalizer.php | 29 +++-- 17 files changed, 107 insertions(+), 187 deletions(-) diff --git a/lib/RoadizCompatBundle/src/Controller/Controller.php b/lib/RoadizCompatBundle/src/Controller/Controller.php index 8b1f2d83..a91b92fe 100644 --- a/lib/RoadizCompatBundle/src/Controller/Controller.php +++ b/lib/RoadizCompatBundle/src/Controller/Controller.php @@ -303,28 +303,6 @@ public function removeTrailingSlashAction(Request $request): RedirectResponse return $this->redirect($url, Response::HTTP_MOVED_PERMANENTLY); } - /** - * Make translation variable with the good localization. - * - * @param Request $request - * @param string|null $_locale - * - * @return TranslationInterface - * @throws NoTranslationAvailableException - */ - protected function bindLocaleFromRoute(Request $request, $_locale = null): TranslationInterface - { - /* - * If you use a static route for Home page - * we need to grab manually language. - * - * Get language from static route - */ - $translation = $this->findTranslationForLocale($_locale); - $request->setLocale($translation->getPreferredLocale()); - return $translation; - } - /** * @param string|null $_locale * diff --git a/lib/RoadizCompatBundle/src/Controller/FrontendController.php b/lib/RoadizCompatBundle/src/Controller/FrontendController.php index dbb63a21..b61883d4 100644 --- a/lib/RoadizCompatBundle/src/Controller/FrontendController.php +++ b/lib/RoadizCompatBundle/src/Controller/FrontendController.php @@ -178,7 +178,8 @@ public function homeAction(Request $request, $_locale = null) * * Get language from static route */ - $translation = $this->bindLocaleFromRoute($request, $_locale); + /** @var TranslationInterface|null $translation */ + $translation = $request->attributes->get('_translation'); /* * Grab home flagged node @@ -304,7 +305,8 @@ protected function extendAssignation() */ public function maintenanceAction(Request $request): Response { - $translation = $this->bindLocaleFromRoute($request, $request->getLocale()); + /** @var TranslationInterface|null $translation */ + $translation = $request->attributes->get('_translation'); $this->prepareThemeAssignation(null, $translation); return new Response( diff --git a/lib/RoadizCompatBundle/src/EventSubscriber/MaintenanceModeSubscriber.php b/lib/RoadizCompatBundle/src/EventSubscriber/MaintenanceModeSubscriber.php index b3904dbd..24bda0cf 100644 --- a/lib/RoadizCompatBundle/src/EventSubscriber/MaintenanceModeSubscriber.php +++ b/lib/RoadizCompatBundle/src/EventSubscriber/MaintenanceModeSubscriber.php @@ -19,21 +19,12 @@ final class MaintenanceModeSubscriber implements EventSubscriberInterface { - private Settings $settings; - private Security $security; - private ThemeResolverInterface $themeResolver; - private ContainerInterface $serviceLocator; - public function __construct( - Settings $settings, - Security $security, - ThemeResolverInterface $themeResolver, - ContainerInterface $serviceLocator + private readonly Settings $settings, + private readonly Security $security, + private readonly ThemeResolverInterface $themeResolver, + private readonly ContainerInterface $serviceLocator ) { - $this->settings = $settings; - $this->security = $security; - $this->themeResolver = $themeResolver; - $this->serviceLocator = $serviceLocator; } /** @@ -133,15 +124,6 @@ private function getControllerForTheme(Theme $theme, Request $request): Abstract $request->attributes->set('theme', $controller->getTheme()); } - /* - * Set request locale if _locale param - * is present in Route. - */ - $routeParams = $request->get('_route_params'); - if (!empty($routeParams["_locale"])) { - $request->setLocale($routeParams["_locale"]); - } - return $controller; } } diff --git a/lib/RoadizCoreBundle/src/Api/Controller/GetWebResponseByPathController.php b/lib/RoadizCoreBundle/src/Api/Controller/GetWebResponseByPathController.php index 15ac2557..76db55a0 100644 --- a/lib/RoadizCoreBundle/src/Api/Controller/GetWebResponseByPathController.php +++ b/lib/RoadizCoreBundle/src/Api/Controller/GetWebResponseByPathController.php @@ -11,6 +11,7 @@ use RZ\Roadiz\Core\AbstractEntities\PersistableInterface; use RZ\Roadiz\CoreBundle\Api\DataTransformer\WebResponseDataTransformerInterface; use RZ\Roadiz\CoreBundle\Api\Model\WebResponseInterface; +use RZ\Roadiz\CoreBundle\Entity\NodesSources; use RZ\Roadiz\CoreBundle\Entity\Redirection; use RZ\Roadiz\CoreBundle\NodeType\ApiResourceOperationNameGenerator; use RZ\Roadiz\CoreBundle\Preview\PreviewResolverInterface; @@ -58,6 +59,12 @@ public function __invoke(?Request $request): ?WebResponseInterface $request->attributes->set('_api_operation_name', $operationName); $request->attributes->set('_api_resource_class', $resourceClass); $request->attributes->set('_stateless', true); + + if ($resource instanceof NodesSources) { + $request->attributes->set('_translation', $resource->getTranslation()); + $request->attributes->set('_locale', $resource->getTranslation()->getPreferredLocale()); + } + return $this->webResponseDataTransformer->transform($resource, WebResponseInterface::class); } catch (ResourceNotFoundException|ResourceClassNotFoundException $exception) { throw $this->createNotFoundException($exception->getMessage(), $exception); diff --git a/lib/RoadizCoreBundle/src/Api/Controller/TranslationAwareControllerTrait.php b/lib/RoadizCoreBundle/src/Api/Controller/TranslationAwareControllerTrait.php index de21fd9e..47533414 100644 --- a/lib/RoadizCoreBundle/src/Api/Controller/TranslationAwareControllerTrait.php +++ b/lib/RoadizCoreBundle/src/Api/Controller/TranslationAwareControllerTrait.php @@ -23,6 +23,11 @@ abstract protected function getPreviewResolver(): PreviewResolverInterface; protected function getTranslation(Request $request): TranslationInterface { $locale = $request->query->get('_locale'); + $requestTranslation = $request->attributes->get('_translation'); + if ($requestTranslation instanceof TranslationInterface) { + return $requestTranslation; + } + /** @var TranslationRepository $repository */ $repository = $this->getManagerRegistry()->getRepository(TranslationInterface::class); if (!\is_string($locale) || $locale === '') { diff --git a/lib/RoadizCoreBundle/src/Controller/CustomFormController.php b/lib/RoadizCoreBundle/src/Controller/CustomFormController.php index c22ac946..b044580a 100644 --- a/lib/RoadizCoreBundle/src/Controller/CustomFormController.php +++ b/lib/RoadizCoreBundle/src/Controller/CustomFormController.php @@ -9,15 +9,12 @@ use League\Flysystem\FilesystemException; use Limenius\Liform\LiformInterface; use Psr\Log\LoggerInterface; -use RZ\Roadiz\Core\AbstractEntities\TranslationInterface; use RZ\Roadiz\CoreBundle\Bag\Settings; use RZ\Roadiz\CoreBundle\CustomForm\CustomFormHelperFactory; use RZ\Roadiz\CoreBundle\CustomForm\Message\CustomFormAnswerNotifyMessage; use RZ\Roadiz\CoreBundle\Entity\CustomForm; use RZ\Roadiz\CoreBundle\Exception\EntityAlreadyExistsException; use RZ\Roadiz\CoreBundle\Form\Error\FormErrorSerializerInterface; -use RZ\Roadiz\CoreBundle\Preview\PreviewResolverInterface; -use RZ\Roadiz\CoreBundle\Repository\TranslationRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormInterface; @@ -32,47 +29,22 @@ use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\RateLimiter\RateLimiterFactory; use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Contracts\Translation\LocaleAwareInterface; use Symfony\Contracts\Translation\TranslatorInterface; final class CustomFormController extends AbstractController { - private Settings $settingsBag; - private LoggerInterface $logger; - private TranslatorInterface $translator; - private CustomFormHelperFactory $customFormHelperFactory; - private LiformInterface $liform; - private SerializerInterface $serializer; - private FormErrorSerializerInterface $formErrorSerializer; - private ManagerRegistry $registry; - private RateLimiterFactory $customFormLimiter; - private PreviewResolverInterface $previewResolver; - private MessageBusInterface $messageBus; - public function __construct( - Settings $settingsBag, - LoggerInterface $logger, - TranslatorInterface $translator, - CustomFormHelperFactory $customFormHelperFactory, - LiformInterface $liform, - SerializerInterface $serializer, - FormErrorSerializerInterface $formErrorSerializer, - ManagerRegistry $registry, - RateLimiterFactory $customFormLimiter, - PreviewResolverInterface $previewResolver, - MessageBusInterface $messageBus, + private readonly Settings $settingsBag, + private readonly LoggerInterface $logger, + private readonly TranslatorInterface $translator, + private readonly CustomFormHelperFactory $customFormHelperFactory, + private readonly LiformInterface $liform, + private readonly SerializerInterface $serializer, + private readonly FormErrorSerializerInterface $formErrorSerializer, + private readonly ManagerRegistry $registry, + private readonly RateLimiterFactory $customFormLimiter, + private readonly MessageBusInterface $messageBus, ) { - $this->settingsBag = $settingsBag; - $this->logger = $logger; - $this->translator = $translator; - $this->customFormHelperFactory = $customFormHelperFactory; - $this->liform = $liform; - $this->serializer = $serializer; - $this->formErrorSerializer = $formErrorSerializer; - $this->registry = $registry; - $this->customFormLimiter = $customFormLimiter; - $this->previewResolver = $previewResolver; - $this->messageBus = $messageBus; } protected function validateCustomForm(?CustomForm $customForm): void @@ -85,38 +57,6 @@ protected function validateCustomForm(?CustomForm $customForm): void } } - protected function getTranslationFromRequest(?Request $request): TranslationInterface - { - $locale = null; - - if (null !== $request) { - $locale = $request->query->get('_locale'); - - /* - * If no _locale query param is defined check Accept-Language header - */ - if (null === $locale) { - $locale = $request->getPreferredLanguage($this->getTranslationRepository()->getAllLocales()); - } - } - /* - * Then fallback to default CMS locale - */ - if (null === $locale) { - $translation = $this->getTranslationRepository()->findDefault(); - } elseif ($this->previewResolver->isPreview()) { - $translation = $this->getTranslationRepository() - ->findOneByLocaleOrOverrideLocale((string) $locale); - } else { - $translation = $this->getTranslationRepository() - ->findOneAvailableByLocaleOrOverrideLocale((string) $locale); - } - if (null === $translation) { - throw new NotFoundHttpException('No translation for locale ' . $locale); - } - return $translation; - } - /** * @param Request $request * @param int $id @@ -129,11 +69,6 @@ public function definitionAction(Request $request, int $id): JsonResponse $this->validateCustomForm($customForm); $helper = $this->customFormHelperFactory->createHelper($customForm); - $translation = $this->getTranslationFromRequest($request); - $request->setLocale($translation->getPreferredLocale()); - if ($this->translator instanceof LocaleAwareInterface) { - $this->translator->setLocale($translation->getPreferredLocale()); - } $schema = json_encode($this->liform->transform($helper->getForm($request, false, false))); return new JsonResponse( @@ -169,12 +104,6 @@ public function postAction(Request $request, int $id): Response $customForm = $this->registry->getRepository(CustomForm::class)->find($id); $this->validateCustomForm($customForm); - $translation = $this->getTranslationFromRequest($request); - $request->setLocale($translation->getPreferredLocale()); - if ($this->translator instanceof LocaleAwareInterface) { - $this->translator->setLocale($translation->getPreferredLocale()); - } - $mixed = $this->prepareAndHandleCustomFormAssignation( $request, $customForm, @@ -322,10 +251,13 @@ public function prepareAndHandleCustomFormAssignation( ['%name%' => $customFormsEntity->getDisplayName()] ); - $session = $request->getSession(); - if ($session instanceof Session) { - $session->getFlashBag()->add('confirm', $msg); + if (!$request->attributes->getBoolean('_stateless') && $request->hasPreviousSession()) { + $session = $request->getSession(); + if ($session instanceof Session) { + $session->getFlashBag()->add('confirm', $msg); + } } + $this->logger->info($msg); return $response; @@ -338,16 +270,4 @@ public function prepareAndHandleCustomFormAssignation( $assignation['formObject'] = $form; return $assignation; } - - protected function getTranslationRepository(): TranslationRepository - { - $repository = $this->registry->getRepository(TranslationInterface::class); - if (!$repository instanceof TranslationRepository) { - throw new \RuntimeException( - 'Translation repository must be instance of ' . - TranslationRepository::class - ); - } - return $repository; - } } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/LocaleSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/LocaleSubscriber.php index 19a3b5f5..1796e233 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/LocaleSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/LocaleSubscriber.php @@ -7,13 +7,17 @@ use Doctrine\Persistence\ManagerRegistry; use RZ\Roadiz\Core\AbstractEntities\TranslationInterface; use RZ\Roadiz\CoreBundle\Entity\Translation; +use RZ\Roadiz\CoreBundle\Preview\PreviewResolverInterface; +use RZ\Roadiz\CoreBundle\Repository\TranslationRepository; use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\Routing\RequestContextAwareInterface; final class LocaleSubscriber implements EventSubscriberInterface { public function __construct( + private readonly PreviewResolverInterface $previewResolver, private readonly ManagerRegistry $managerRegistry, private readonly RequestContextAwareInterface $router ) { @@ -30,9 +34,40 @@ public static function getSubscribedEvents(): array ]; } + private function getRepository(): TranslationRepository + { + return $this->managerRegistry->getRepository(Translation::class); + } + private function getDefaultTranslation(): ?TranslationInterface { - return $this->managerRegistry->getRepository(Translation::class)->findDefault(); + return $this->getRepository()->findDefault(); + } + + private function supportsLocale(?string $locale): bool + { + if (null === $locale || $locale === '') { + return false; + } + + if ($this->previewResolver->isPreview()) { + $locales = $this->getRepository()->getAllLocales(); + } else { + $locales = $this->getRepository()->getAvailableLocales(); + } + return \in_array( + $locale, + $locales, + true + ); + } + + private function getTranslationByLocale(string $locale): ?TranslationInterface + { + if ($this->previewResolver->isPreview()) { + return $this->getRepository()->findOneByLocaleOrOverrideLocale($locale); + } + return $this->getRepository()->findOneAvailableByLocaleOrOverrideLocale($locale); } public function onKernelRequest(RequestEvent $event): void @@ -43,29 +78,37 @@ public function onKernelRequest(RequestEvent $event): void /* * Set default locale */ - if (null !== $locale && $locale !== '') { - $this->setLocale($event, $locale); + if ($this->supportsLocale($locale)) { + $this->setTranslation($request, $this->getTranslationByLocale($locale)); return; } if (!$request->attributes->getBoolean('_stateless') && $request->hasPreviousSession()) { - $locale = $request->getSession()->get('_locale', null); - if (null !== $locale) { - $this->setLocale($event, $locale); + $sessionLocale = $request->getSession()->get('_locale', null); + if ($this->supportsLocale($sessionLocale)) { + $this->setTranslation($request, $this->getTranslationByLocale($sessionLocale)); return; } } if (null !== $translation = $this->getDefaultTranslation()) { - $shortLocale = $translation->getLocale(); - $this->setLocale($event, $shortLocale); + $this->setTranslation($request, $translation); return; } } - private function setLocale(RequestEvent $event, string $locale): void + private function setTranslation(Request $request, ?TranslationInterface $translation): void { - $event->getRequest()->setLocale($locale); + if (null === $translation) { + return; + } + $locale = $translation->getPreferredLocale(); + /* + * Set current translation globally for controllers, utils, etc + */ + $request->attributes->set('_translation', $translation); + $request->attributes->set('_locale', $locale); + $request->setLocale($locale); \Locale::setDefault($locale); $this->router->getContext()->setParameter('_locale', $locale); } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/NodeNameSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/NodeNameSubscriber.php index 17517016..91659409 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/NodeNameSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/NodeNameSubscriber.php @@ -43,7 +43,6 @@ public static function getSubscribedEvents(): array { return [ NodesSourcesPreUpdatedEvent::class => ['onBeforeUpdate', 0], - '\RZ\Roadiz\Core\Events\NodesSources\NodesSourcesPreUpdatedEvent' => ['onBeforeUpdate', 0], ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/NodeRedirectionSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/NodeRedirectionSubscriber.php index 31158fbb..db51b649 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/NodeRedirectionSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/NodeRedirectionSubscriber.php @@ -40,7 +40,6 @@ public static function getSubscribedEvents(): array { return [ NodePathChangedEvent::class => 'redirectOldPaths', - '\RZ\Roadiz\Core\Events\Node\NodePathChangedEvent' => 'redirectOldPaths' ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUniversalSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUniversalSubscriber.php index d13e80d6..b16cb180 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUniversalSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUniversalSubscriber.php @@ -33,7 +33,6 @@ public static function getSubscribedEvents(): array { return [ NodesSourcesUpdatedEvent::class => 'duplicateUniversalContents', - '\RZ\Roadiz\Core\Events\NodesSources\NodesSourcesUpdatedEvent' => 'duplicateUniversalContents', ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUrlsCacheEventSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUrlsCacheEventSubscriber.php index 771eea51..19a51cbd 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUrlsCacheEventSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/NodesSourcesUrlsCacheEventSubscriber.php @@ -37,28 +37,17 @@ public static function getSubscribedEvents(): array { return [ NodesSourcesCreatedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\NodesSources\NodesSourcesCreatedEvent' => 'onPurgeRequest', NodesSourcesDeletedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\NodesSources\NodesSourcesDeletedEvent' => 'onPurgeRequest', TranslationUpdatedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\Translation\TranslationUpdatedEvent' => 'onPurgeRequest', TranslationDeletedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\Translation\TranslationDeletedEvent' => 'onPurgeRequest', NodeDeletedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\Node\NodeDeletedEvent' => 'onPurgeRequest', NodeUndeletedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\Node\NodeUndeletedEvent' => 'onPurgeRequest', NodeUpdatedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\Node\NodeUpdatedEvent' => 'onPurgeRequest', UrlAliasCreatedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\UrlAlias\UrlAliasCreatedEvent' => 'onPurgeRequest', UrlAliasUpdatedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\UrlAlias\UrlAliasUpdatedEvent' => 'onPurgeRequest', UrlAliasDeletedEvent::class => 'onPurgeRequest', - '\RZ\Roadiz\Core\Events\UrlAlias\UrlAliasDeletedEvent' => 'onPurgeRequest', 'workflow.node.completed' => 'onPurgeRequest', CachePurgeRequestEvent::class => ['onPurgeRequest', 3], - '\RZ\Roadiz\Core\Events\Cache\CachePurgeRequestEvent' => ['onPurgeRequest', 3], ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/OPCacheEventSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/OPCacheEventSubscriber.php index 6ab73e53..fb080645 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/OPCacheEventSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/OPCacheEventSubscriber.php @@ -17,7 +17,6 @@ public static function getSubscribedEvents(): array { return [ CachePurgeRequestEvent::class => ['onPurgeRequest', 3], - '\RZ\Roadiz\Core\Events\Cache\CachePurgeRequestEvent' => ['onPurgeRequest', 3], ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/ReverseProxyCacheEventSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/ReverseProxyCacheEventSubscriber.php index b21cb81e..d59055fc 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/ReverseProxyCacheEventSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/ReverseProxyCacheEventSubscriber.php @@ -46,9 +46,7 @@ public static function getSubscribedEvents(): array { return [ CachePurgeRequestEvent::class => ['onBanRequest', 3], - '\RZ\Roadiz\Core\Events\Cache\CachePurgeRequestEvent' => ['onBanRequest', 3], NodesSourcesUpdatedEvent::class => ['onPurgeRequest', 3], - '\RZ\Roadiz\Core\Events\NodesSources\NodesSourcesUpdatedEvent' => ['onPurgeRequest', 3], 'workflow.node.completed' => ['onNodeWorkflowCompleted', 3], ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/RoleSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/RoleSubscriber.php index d04eb2ab..b3547449 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/RoleSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/RoleSubscriber.php @@ -37,11 +37,8 @@ public static function getSubscribedEvents(): array { return [ PreCreatedRoleEvent::class => 'onRoleChanged', - '\RZ\Roadiz\Core\Events\Role\PreCreatedRoleEvent' => 'onRoleChanged', PreUpdatedRoleEvent::class => 'onRoleChanged', - '\RZ\Roadiz\Core\Events\Role\PreUpdatedRoleEvent' => 'onRoleChanged', PreDeletedRoleEvent::class => 'onRoleChanged', - '\RZ\Roadiz\Core\Events\Role\PreDeletedRoleEvent' => 'onRoleChanged', ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/TranslationSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/TranslationSubscriber.php index e7f61509..6e773d4f 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/TranslationSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/TranslationSubscriber.php @@ -31,11 +31,8 @@ public static function getSubscribedEvents(): array { return [ TranslationCreatedEvent::class => 'purgeCache', - '\RZ\Roadiz\Core\Events\Translation\TranslationCreatedEvent' => 'purgeCache', TranslationUpdatedEvent::class => 'purgeCache', - '\RZ\Roadiz\Core\Events\Translation\TranslationUpdatedEvent' => 'purgeCache', TranslationDeletedEvent::class => 'purgeCache', - '\RZ\Roadiz\Core\Events\Translation\TranslationDeletedEvent' => 'purgeCache', ]; } diff --git a/lib/RoadizCoreBundle/src/EventSubscriber/UserLocaleSubscriber.php b/lib/RoadizCoreBundle/src/EventSubscriber/UserLocaleSubscriber.php index 3604eda3..a008a6a8 100644 --- a/lib/RoadizCoreBundle/src/EventSubscriber/UserLocaleSubscriber.php +++ b/lib/RoadizCoreBundle/src/EventSubscriber/UserLocaleSubscriber.php @@ -35,7 +35,6 @@ public static function getSubscribedEvents(): array return [ SecurityEvents::INTERACTIVE_LOGIN => 'onInteractiveLogin', UserUpdatedEvent::class => [['onUserUpdated']], - '\RZ\Roadiz\Core\Events\User\UserUpdatedEvent' => [['onUserUpdated']], ]; } diff --git a/lib/RoadizCoreBundle/src/Serializer/Normalizer/TranslationAwareNormalizer.php b/lib/RoadizCoreBundle/src/Serializer/Normalizer/TranslationAwareNormalizer.php index 4d081b19..c6beaba0 100644 --- a/lib/RoadizCoreBundle/src/Serializer/Normalizer/TranslationAwareNormalizer.php +++ b/lib/RoadizCoreBundle/src/Serializer/Normalizer/TranslationAwareNormalizer.php @@ -76,19 +76,26 @@ private function getTranslationFromRequest(): ?TranslationInterface { $request = $this->requestStack->getMainRequest(); - if (null !== $request) { - $locale = $request->query->get('_locale', $request->getLocale()); - if ( - \is_string($locale) && - null !== $translation = $this->getTranslationFromLocale($locale) - ) { - return $translation; - } + if (null === $request) { + return $this->managerRegistry + ->getRepository(Translation::class) + ->findDefault(); + } + + $requestTranslation = $request->attributes->get('_translation'); + if ($requestTranslation instanceof TranslationInterface) { + return $requestTranslation; + } + + $locale = $request->query->get('_locale', $request->getLocale()); + if ( + \is_string($locale) && + null !== $translation = $this->getTranslationFromLocale($locale) + ) { + return $translation; } - return $this->managerRegistry - ->getRepository(Translation::class) - ->findDefault(); + return null; } public function supportsNormalization(mixed $data, string $format = null, array $context = []): bool