vendor/dedi/sylius-seo-plugin/src/Context/RichSnippetContext.php line 21

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Dedi\SyliusSEOPlugin\Context;
  4. use Dedi\SyliusSEOPlugin\Context\SubjectFetcher\SubjectFetcherInterface;
  5. use Dedi\SyliusSEOPlugin\Domain\SEO\Adapter\RichSnippetSubjectInterface;
  6. use Dedi\SyliusSEOPlugin\Domain\SEO\Factory\RichSnippetFactoryInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. final class RichSnippetContext
  10. {
  11.     private ?Request $request;
  12.     /** @var SubjectFetcherInterface[] */
  13.     private array $subjectFetchers;
  14.     /** @var RichSnippetFactoryInterface[] */
  15.     private array $richSnippetFactories;
  16.     public function __construct(
  17.         RequestStack $requestStack,
  18.         iterable $subjectFetchers,
  19.         iterable $richSnippetFactories
  20.     ) {
  21.         $this->request $requestStack->getMasterRequest();
  22.         $this->subjectFetchers iterator_to_array($subjectFetchers);
  23.         $this->richSnippetFactories iterator_to_array($richSnippetFactories);
  24.     }
  25.     /**
  26.      * Iterates over RichSnippetFactoryInterface[] in order to get every Rich Snippets Urls available for a given subject.
  27.      *
  28.      * @return array
  29.      */
  30.     public function getAvailableRichSnippets(): array
  31.     {
  32.         $subject $this->guessSubject();
  33.         if (!$subject) {
  34.             return [];
  35.         }
  36.         $richSnippets = [];
  37.         foreach ($this->richSnippetFactories as $factory) {
  38.             if ($factory->can($subject)) {
  39.                 $richSnippets[] = $factory->buildRichSnippet($subject);
  40.             }
  41.         }
  42.         return $richSnippets;
  43.     }
  44.     /**
  45.      * Iterates over SubjectFetcherInterface[] in order to find a subject for the current request.
  46.      *
  47.      * @return RichSnippetSubjectInterface|null
  48.      */
  49.     private function guessSubject(): ?RichSnippetSubjectInterface
  50.     {
  51.         foreach ($this->subjectFetchers as $subjectFetcher) {
  52.             if ($subjectFetcher->canFromRequest($this->request)) {
  53.                 return $subjectFetcher->fetchFromRequest($this->request);
  54.             }
  55.         }
  56.         return null;
  57.     }
  58. }