vendor/sulu/sulu/src/Sulu/Component/Content/Document/Subscriber/ExtensionSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of Sulu.
  4. *
  5. * (c) Sulu GmbH
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Sulu\Component\Content\Document\Subscriber;
  11. use Sulu\Bundle\DocumentManagerBundle\Bridge\DocumentInspector;
  12. use Sulu\Bundle\DocumentManagerBundle\Bridge\PropertyEncoder;
  13. use Sulu\Component\Content\Document\Behavior\ExtensionBehavior;
  14. use Sulu\Component\Content\Document\Extension\ManagedExtensionContainer;
  15. use Sulu\Component\Content\Extension\ExtensionManagerInterface;
  16. use Sulu\Component\DocumentManager\Event\AbstractMappingEvent;
  17. use Sulu\Component\DocumentManager\Events;
  18. use Sulu\Component\DocumentManager\NamespaceRegistry;
  19. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  20. class ExtensionSubscriber implements EventSubscriberInterface
  21. {
  22. /**
  23. * TODO: Remove this: Use a dedicated namespace instead.
  24. *
  25. * @var string
  26. */
  27. private $internalPrefix = '';
  28. public function __construct(
  29. private PropertyEncoder $encoder,
  30. private ExtensionManagerInterface $extensionManager,
  31. private DocumentInspector $inspector,
  32. // these two dependencies should absolutely not be necessary
  33. private NamespaceRegistry $namespaceRegistry
  34. ) {
  35. }
  36. public static function getSubscribedEvents()
  37. {
  38. return [
  39. // persist should happen before content is mapped
  40. Events::PERSIST => ['saveExtensionData', 10],
  41. Events::PUBLISH => ['saveExtensionData', 10],
  42. // hydrate should happen afterwards
  43. Events::HYDRATE => ['handleHydrate', -10],
  44. ];
  45. }
  46. public function handleHydrate(AbstractMappingEvent $event)
  47. {
  48. if (!$event->getDocument() instanceof ExtensionBehavior) {
  49. return;
  50. }
  51. $this->hydrate($event);
  52. }
  53. public function saveExtensionData(AbstractMappingEvent $event)
  54. {
  55. $locale = $event->getLocale();
  56. if (!$locale) {
  57. return;
  58. }
  59. $document = $event->getDocument();
  60. if (!$document instanceof ExtensionBehavior) {
  61. return;
  62. }
  63. $structureType = (string) $document->getStructureType();
  64. $node = $event->getNode();
  65. $extensionsData = $document->getExtensionsData();
  66. $webspaceName = $this->inspector->getWebspace($document);
  67. $prefix = $this->namespaceRegistry->getPrefix('extension_localized');
  68. $extensions = $this->extensionManager->getExtensions($structureType);
  69. foreach ($extensions as $extension) {
  70. $extensionData = null;
  71. if (!isset($extensionsData[$extension->getName()])) {
  72. continue;
  73. }
  74. $extensionData = $extensionsData[$extension->getName()];
  75. $extension->setLanguageCode($locale, $prefix, $this->internalPrefix);
  76. $extension->save(
  77. $node,
  78. $extensionData,
  79. $webspaceName,
  80. $locale
  81. );
  82. }
  83. $this->hydrate($event);
  84. }
  85. private function hydrate(AbstractMappingEvent $event)
  86. {
  87. $document = $event->getDocument();
  88. $node = $event->getNode();
  89. $locale = $this->inspector->getLocale($document);
  90. $webspaceName = $this->inspector->getWebspace($document);
  91. $structureType = $document->getStructureType();
  92. if (null === $structureType) {
  93. return;
  94. }
  95. $prefix = $this->namespaceRegistry->getPrefix('extension_localized');
  96. $extensionContainer = new ManagedExtensionContainer(
  97. $structureType,
  98. $this->extensionManager,
  99. $node,
  100. $locale,
  101. $prefix,
  102. $this->internalPrefix,
  103. $webspaceName
  104. );
  105. $document->setExtensionsData($extensionContainer);
  106. }
  107. }