vendor/moka/cms/src/Controller/EntryController.php line 25

Open in your IDE?
  1. <?php
  2. namespace Moka\Cms\Controller;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Doctrine\Persistence\ManagerRegistry;
  5. use Moka\Cms\Bridge\Doctrine\QueryBuilder\EntryQueryBuilder;
  6. use Moka\Cms\Entity\EntryInterface;
  7. use Moka\Cms\Exception\EntryRouteException;
  8. use Moka\Cms\Exception\NotPublishedHttpException;
  9. use Moka\Cms\Exception\RendererException;
  10. use Moka\Cms\Model\EntryMetadata;
  11. use Moka\Cms\Model\Model;
  12. use Moka\Cms\Renderer\RendererManager;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. class EntryController extends AbstractController
  17. {
  18.     public function __construct(private Model $model, private RendererManager $rendererManager, private ManagerRegistry $managerRegistry)
  19.     {
  20.     }
  21.     public function show(Request $request)
  22.     {
  23.         if (!$type $request->attributes->get('_type')) {
  24.             throw new EntryRouteException('Route attribute "_type" is required');
  25.         }
  26.         $entryMetadata $this->model->getEntryMetadata($type);
  27.         $renderer $request->attributes->get('_renderer') ?? $entryMetadata->getDefaultRendererName();
  28.         if (!$renderer) {
  29.             throw new RendererException('Default entry renderer or route attribute "_renderer" is required');
  30.         }
  31.         $rendererContext $request->attributes->get('_renderer_context') ?? $entryMetadata->getDefaultRendererContext();
  32.         $rendererContext['locale'] ??= $request->getLocale();
  33.         $attributes array_filter($request->attributes->all(), fn ($name) => !str_starts_with($name'_'), ARRAY_FILTER_USE_KEY);
  34.         if (!$entryMetadata->isSingle() && === count($attributes)) {
  35.             throw new EntryRouteException('You must declare a route attribute');
  36.         }
  37.         /** @var null|EntryInterface $entry */
  38.         $entry $entryMetadata->isSingle()
  39.             ? $this->getSingleEntry($entryMetadata$request->getLocale())
  40.             : $this->getEntry($entryMetadata$request->getLocale(), $attributes);
  41.         if (!$entry) {
  42.             throw $this->createNotFoundException();
  43.         }
  44.         if (!$entry->isPublished() || !$entry->hasLocale($request->getLocale())) {
  45.             throw new NotPublishedHttpException('Entry is not published');
  46.         }
  47.         $rs $this->rendererManager->get($renderer)->render($entry$rendererContext);
  48.         if ($rs instanceof Response) {
  49.             return $rs;
  50.         }
  51.         return new Response($rs);
  52.     }
  53.     protected function getEntry(EntryMetadata $entryMetadatastring $locale, array $attributes): ?EntryInterface
  54.     {
  55.         $qb $this->createQueryBuilder($entryMetadata$locale);
  56.         foreach ($attributes as $name => $value) {
  57.             if ($entryMetadata->hasField($name)) {
  58.                 $qb->addWhereFieldEqual($name$value);
  59.             }
  60.         }
  61.         return $qb->getQuery()->getOneOrNullResult();
  62.     }
  63.     protected function getSingleEntry(EntryMetadata $entryMetadatastring $locale): ?EntryInterface
  64.     {
  65.         return $this->createQueryBuilder($entryMetadata$locale)->getQuery()->getOneOrNullResult();
  66.     }
  67.     protected function createQueryBuilder(EntryMetadata $entryMetadatastring $locale): EntryQueryBuilder
  68.     {
  69.         /** @var EntityManagerInterface $entityManager */
  70.         $entityManager $this->managerRegistry->getManagerForClass($entryMetadata->getClassName());
  71.         return (new EntryQueryBuilder($entityManager$entryMetadata))
  72.             ->select('entry')
  73.             ->from($entryMetadata->getClassName(), 'entry')
  74.             ->setLocale($locale)
  75.             ->whereIsMain()
  76.             ->joinTranslation();
  77.     }
  78. }