src/Controller/BlogController.php line 85

Open in your IDE?
  1. <?php
  2. /**
  3.  * @author Antony Tkachenko <at@canaryknight.ru>
  4.  */
  5. namespace App\Controller;
  6. use App\Entity\BlogPost;
  7. use App\Entity\BlogTag;
  8. use App\Repository\BlogPostRepository;
  9. use App\Repository\BlogTagRepository;
  10. use Doctrine\ORM\NonUniqueResultException;
  11. use Doctrine\ORM\NoResultException;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. /**
  19.  * @Route("/blog", name="blog_")
  20.  */
  21. class BlogController extends AbstractController
  22. {
  23.     private BlogPostRepository $blogPostRepository;
  24.     private BlogTagRepository $tagRepository;
  25.     private RequestStack $requestStack;
  26.     public function __construct(
  27.         BlogPostRepository $blogPostRepository,
  28.         BlogTagRepository  $tagRepository,
  29.         RequestStack       $requestStack
  30.     )
  31.     {
  32.         $this->blogPostRepository $blogPostRepository;
  33.         $this->tagRepository      $tagRepository;
  34.         $this->requestStack       $requestStack;
  35.     }
  36.     private function getListTemplateName(): string
  37.     {
  38.         if ($this->requestStack->getMainRequest()->isMethod(Request::METHOD_POST)) {
  39.             return 'blog/index_content.html.twig';
  40.         }
  41.         return 'blog/index.html.twig';
  42.     }
  43.     private function getPageCount(?BlogTag $tag NULL): int
  44.     {
  45.         $query $this->blogPostRepository->onlyPublished(1$tag);
  46.         return (int)ceil($query->select('count(b.id)')->setMaxResults(NULL)->setFirstResult(NULL)->getQuery()->getSingleScalarResult() / BlogPostRepository::PAGE_SIZE);
  47.     }
  48.     /**
  49.      * @return BlogPost[]
  50.      */
  51.     private function findPosts(int $page 1, ?BlogTag $tag NULL): array
  52.     {
  53.         $query $this->blogPostRepository->onlyPublished($page$tag);
  54.         return $query->getQuery()->getResult();
  55.     }
  56.     private function lastModified(): ?\DateTimeInterface {
  57.         $query $this->blogPostRepository->lastModified();
  58.         try {
  59.             $result $query->getQuery()->getSingleResult();
  60.             if ($result && $result->getUpdatedAt()) {
  61.                 return $result->getUpdatedAt();
  62.             }
  63.         } catch (NonUniqueResultException|NoResultException $e) {
  64.         }
  65.         return null;
  66.     }
  67.     /**
  68.      * @Route("/{page<\d+>}", name="index", methods={"GET", "POST"}, defaults={"page":1})
  69.      */
  70.     public function index(int $page): Response
  71.     {
  72.         $date $this->lastModified();
  73.         $modified $date $date->format('D, d M Y H:i:s \G\M\T') : date('D, d M Y H:i:s \G\M\T');
  74.         $response $this->render($this->getListTemplateName(), [
  75.             'tags'          => $this->tagRepository->onlyActive(),
  76.             'posts'         => $this->findPosts($page),
  77.             'current_page'  => $page,
  78.             'next_page_url' => $this->generateUrl('blog_index', ['page' => $page 1]),
  79.             'page_count'    => $this->getPageCount(),
  80.             'current_tag'   => NULL,
  81.             'modified'      => $modified,
  82.         ]);
  83.         $response->headers->set('Last-Modified'$modified);
  84.         return $response;
  85.     }
  86.     /**
  87.      * @Route("/tag/{slug}/{page<\d+>}", name="tag", methods={"GET"}, defaults={"page":1})
  88.      */
  89.     public function tag(
  90.         int     $page,
  91.         BlogTag $tag
  92.     ): Response
  93.     {
  94.         $date $this->lastModified();
  95.         $modified $date $date->format('D, d M Y H:i:s \G\M\T') : date('D, d M Y H:i:s \G\M\T');
  96.         $response =  $this->render($this->getListTemplateName(), [
  97.             'tags'          => $this->tagRepository->onlyActive(),
  98.             'posts'         => $this->findPosts($page$tag),
  99.             'current_page'  => $page,
  100.             'next_page_url' => $this->generateUrl('blog_index', ['page' => $page 1]),
  101.             'page_count'    => $this->getPageCount($tag),
  102.             'current_tag'   => $tag->getId(),
  103.             'modified'      => $modified,
  104.         ]);
  105.         $response->headers->set('Last-Modified'$modified);
  106.         return $response;
  107.     }
  108.     /**
  109.      * @Route("/post/{slug}", name="post", methods={"GET"})
  110.      */
  111.     public function post(BlogPost $post): Response
  112.     {
  113.         if (true !== $post->isPublished() && !$this->isGranted('ROLE_ADMIN')) {
  114.             throw new NotFoundHttpException();
  115.         }
  116.         $date $post->getUpdatedAt() ?: $post->getCreatedAt();
  117.         $modified $date->format('D, d M Y H:i:s \G\M\T');
  118.         $response $this->render('blog/post.html.twig', [
  119.             'post' => $post,
  120.             'similar' => $this->blogPostRepository->findSimilar($post),
  121.             'tags' => $this->tagRepository->onlyActive(),
  122.             'title' => $post->getPageTitle(),
  123.             'description' => $post->getMetaDescription(),
  124.             'keywords' => $post->getMetaKeywords(),
  125.             'modified' => $modified,
  126.         ]);
  127.         $response->headers->set('Last-Modified'$modified);
  128.         return $response;
  129.     }
  130. }