vendor/sulu/sulu/src/Sulu/Bundle/SnippetBundle/Snippet/SnippetResolver.php line 52

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\Bundle\SnippetBundle\Snippet;
  11. use Sulu\Bundle\SnippetBundle\Document\SnippetDocument;
  12. use Sulu\Bundle\WebsiteBundle\Resolver\StructureResolverInterface;
  13. use Sulu\Component\Content\Compat\Structure\SnippetBridge;
  14. use Sulu\Component\Content\Compat\StructureInterface;
  15. use Sulu\Component\Content\Mapper\ContentMapperInterface;
  16. use Sulu\Component\DocumentManager\Exception\DocumentNotFoundException;
  17. use Symfony\Contracts\Service\ResetInterface;
  18. /**
  19. * Resolves snippets by UUIDs.
  20. */
  21. class SnippetResolver implements SnippetResolverInterface, ResetInterface
  22. {
  23. /**
  24. * @var array<array|StructureInterface>
  25. */
  26. private $snippetCache = [];
  27. public function __construct(
  28. private ContentMapperInterface $contentMapper,
  29. private StructureResolverInterface $structureResolver,
  30. ) {
  31. }
  32. public function reset(): void
  33. {
  34. $this->snippetCache = [];
  35. }
  36. /**
  37. * @param array<string> $uuids
  38. * @param string $webspaceKey
  39. * @param string $locale
  40. * @param string|null $shadowLocale
  41. * @param bool $loadExcerpt
  42. *
  43. * @return array
  44. */
  45. public function resolve($uuids, $webspaceKey, $locale, $shadowLocale = null, $loadExcerpt = false)
  46. {
  47. $snippets = [];
  48. foreach ($uuids as $uuid) {
  49. $cacheKey = \sprintf('%s|%s|%s|%s', $locale, $uuid, $shadowLocale ?? 'null', $loadExcerpt ? 'true' : 'false');
  50. if (!\array_key_exists($cacheKey, $this->snippetCache)) {
  51. try {
  52. $snippet = $this->contentMapper->load($uuid, $webspaceKey, $locale);
  53. } catch (DocumentNotFoundException $e) {
  54. continue;
  55. }
  56. if (!$snippet->getHasTranslation() && null !== $shadowLocale) {
  57. /** @var SnippetBridge $snippet */
  58. $snippet = $this->contentMapper->load($uuid, $webspaceKey, $shadowLocale);
  59. /** @var SnippetDocument $document */
  60. $document = $snippet->getDocument();
  61. $document->setLocale($shadowLocale);
  62. $document->setOriginalLocale($locale);
  63. }
  64. $snippet->setIsShadow(null !== $shadowLocale);
  65. $snippet->setShadowBaseLanguage($shadowLocale);
  66. $resolved = $this->structureResolver->resolve($snippet, $loadExcerpt);
  67. if ($loadExcerpt) {
  68. $resolved['content']['taxonomies'] = [
  69. 'categories' => $resolved['extension']['excerpt']['categories'],
  70. 'tags' => $resolved['extension']['excerpt']['tags'],
  71. ];
  72. }
  73. $resolved['view']['template'] = $snippet->getKey();
  74. $resolved['view']['uuid'] = $snippet->getUuid();
  75. $this->snippetCache[$cacheKey] = $resolved;
  76. }
  77. $snippets[] = $this->snippetCache[$cacheKey];
  78. }
  79. return $snippets;
  80. }
  81. }