src/Controller/Frontend/DossierController.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Application\Artikel\ArtikelFrontendData;
  4. use App\Application\Artikel\ArtikelService;
  5. use App\Application\Artikel\ArtikelServiceQuery;
  6. use App\Application\Dossier\DossierFrontendData;
  7. use App\Application\Dossier\DossierService;
  8. use App\Entity\Dossier\Exceptions\DossierNotExistsException;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. #[Route(path: '/dossier')]
  15. #[Cache(expires: '+10 minutes')]
  16. class DossierController extends AbstractController
  17. {
  18. #[Route(path: '/', name: 'fe.dossiers')]
  19. public function dossiers(DossierService $dossierService, ArtikelService $artikelService): Response
  20. {
  21. $dossiers = $dossierService->findAll(new DossierFrontendData());
  22. // fetch first article for each dossier
  23. foreach ($dossiers as $key => $dossier) {
  24. $dossiers[$key]['artikel'] = [];
  25. $query = new ArtikelServiceQuery(1, 1);
  26. $query->addFilterOneOfStatusOnly(['publiziert']);
  27. $query->addFilterOneOfDossierOnly([$dossier['id']]);
  28. $query->addSort('publish_at', 'desc');
  29. $res = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
  30. if ($res) {
  31. $dossiers[$key]['artikel'] = reset($res);
  32. }
  33. }
  34. return $this->render('frontend/dossier/dossiers.html.twig', [
  35. 'dossiers' => $dossiers,
  36. ]);
  37. }
  38. #[Route(path: '/{slug}', name: 'fe.dossier-artikel')]
  39. public function dossierArtikel(Request $request, $slug, DossierService $dossierService, ArtikelService $artikelService): Response
  40. {
  41. // Validierung aller möglichen URL-Parameter sonst Fehler (Page- und ApiClientCache Cache Schutz)
  42. if (($urlParams = array_keys($request->query->all())) && ($diff_ = array_diff($urlParams, ['pg']))) {
  43. throw $this->createNotFoundException(sprintf('Suche mit nicht konfiguriertem URL Parameter abgesetzt: %s', implode(',', $diff_)));
  44. }
  45. // Ende
  46. $pageSize = 12;
  47. $pageNumber = $request->query->getInt('pg', 1);
  48. try {
  49. $dossier = $dossierService->getDossierBySlug($slug, new DossierFrontendData());
  50. } catch (DossierNotExistsException $exception) {
  51. throw $this->createNotFoundException('Dossier does not exist');
  52. }
  53. $query = new ArtikelServiceQuery($pageSize, $pageNumber, false);
  54. $query->addFilterOneOfStatusOnly(['publiziert']);
  55. $query->addFilterOneOfDossierOnly([$dossier['id']]);
  56. $query->addSort('publish_at', 'desc');
  57. $artikels = $artikelService->findArtikels(new ArtikelFrontendData(), $query);
  58. $paging = [
  59. 'page_size' => $query->getPageSize(),
  60. 'page_curr' => $query->getPageNr(),
  61. 'page_prev' => $query->getPageNr() == 1 ? null : $query->getPageNr() - 1,
  62. 'page_next' => $query->getPageNextExist() ? $query->getPageNr() + 1 : null,
  63. ];
  64. return $this->render('frontend/dossier/dossier_artikel.html.twig', [
  65. 'dossier' => $dossier,
  66. 'artikels' => $artikels,
  67. 'paging' => $paging,
  68. ]);
  69. }
  70. }