src/EventSubscriber/LegacyInjectedSettingsSubscriber.php line 54

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use eZ\Publish\Core\MVC\Legacy\Event\PreBuildKernelEvent;
  5. use eZ\Publish\Core\MVC\Legacy\LegacyEvents;
  6. use eZ\Publish\Core\MVC\Symfony\SiteAccess;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. /**
  10. * Injects INI settings into the legacy kernel at boot time.
  11. *
  12. * Configured via parameters in config/packages/ez_publish_legacy.yaml:
  13. *
  14. * parameters:
  15. * # Global — applied to every siteaccess
  16. * app.legacy.injected_settings:
  17. * 'file.ini/SectionName/SettingName': value
  18. * app.legacy.injected_merge_settings:
  19. * 'file.ini/SectionName/ArraySetting': [value1, value2]
  20. *
  21. * # Per-siteaccess — applied only when the named siteaccess is active
  22. * app.legacy.siteaccess_injected_settings:
  23. * my_siteaccess:
  24. * 'file.ini/SectionName/SettingName': value
  25. * app.legacy.siteaccess_injected_merge_settings:
  26. * my_siteaccess:
  27. * 'file.ini/SectionName/ArraySetting': [value1, value2]
  28. */
  29. final class LegacyInjectedSettingsSubscriber implements EventSubscriberInterface
  30. {
  31. public function __construct(
  32. private readonly array $injectedSettings,
  33. private readonly array $injectedMergeSettings,
  34. private readonly array $siteaccessInjectedSettings,
  35. private readonly array $siteaccessInjectedMergeSettings,
  36. private readonly SiteAccess $siteAccess,
  37. private readonly RequestStack $requestStack,
  38. ) {
  39. }
  40. public static function getSubscribedEvents(): array
  41. {
  42. // Priority 64: runs after the built-in LegacyMapper/Configuration (priority 128)
  43. // so our values layer on top via left-hand precedence of array union (+).
  44. return [
  45. LegacyEvents::PRE_BUILD_LEGACY_KERNEL => ['onPreBuildKernel', 64],
  46. ];
  47. }
  48. public function onPreBuildKernel(PreBuildKernelEvent $event): void
  49. {
  50. // Resolve the current siteaccess name. The injected $siteAccess may be a
  51. // different object than the one SiteAccessListener updates, so prefer the
  52. // request attribute (set by SiteAccessListener before this event fires).
  53. $request = $this->requestStack->getCurrentRequest();
  54. $requestSA = $request?->attributes->get('siteaccess');
  55. $saName = ($requestSA instanceof SiteAccess ? $requestSA->name : null)
  56. ?? $this->siteAccess->name;
  57. $settings = ($this->siteaccessInjectedSettings[$saName] ?? []) + $this->injectedSettings;
  58. $mergeSettings = ($this->siteaccessInjectedMergeSettings[$saName] ?? []) + $this->injectedMergeSettings;
  59. if (!empty($settings)) {
  60. $event->getParameters()->set(
  61. 'injected-settings',
  62. $settings + (array) $event->getParameters()->get('injected-settings'),
  63. );
  64. }
  65. if (!empty($mergeSettings)) {
  66. $event->getParameters()->set(
  67. 'injected-merge-settings',
  68. $mergeSettings + (array) $event->getParameters()->get('injected-merge-settings'),
  69. );
  70. }
  71. }
  72. }