<?php
/**
* This file is part of Symfony Keen Template Project.
* (c) 2021 One AM SRL
*/
namespace App\Controller\Frontend;
use App\Entity\Article;
use App\Entity\Category;
use App\Repository\ArticleRepository;
use App\Repository\CategoryRepository;
use Doctrine\ORM\EntityManagerInterface;
use Keen\Annotation\NavbarTag;
use Keen\Attribute\Breadcrumb;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/** @NavbarTag("blog") */
#[Route('/blog', name: 'frontend_blog')]
#[Breadcrumb('Blog')]
class BlogController extends AbstractController
{
#[Route('/{slug}', name: '', defaults: ['slug' => null], methods: ['GET'])]
public function list(
?string $slug,
ArticleRepository $articleRepository,
CategoryRepository $categoryRepository,
PaginatorInterface $paginator,
Request $request,
EntityManagerInterface $entityManager
): Response {
$category = null;
if (null !== $slug && null === $category = $entityManager->getRepository(Category::class)->findOneBy(['slug' => $slug])) {
throw $this->createNotFoundException();
}
$featuredArticle = $articleRepository->createQueryBuilder('article')
->andWhere('article.visible = true')
->andWhere('article.featured = true')
->orderBy('article.date', 'DESC')
->setMaxResults(1)
->getQuery()->getOneOrNullResult();
$qb = $articleRepository->createQueryBuilder('article')
->andWhere('article.visible = true')
->andWhere('article.featured = false')
;
if (null !== $category) {
$qb->andWhere(':category MEMBER OF article.categories')
->setParameter('category', $category);
}
$pagination = $paginator->paginate(
$qb,
max(1, $request->query->get('page', 1)),
min($request->query->get('perPage', 9), 9),
[
'sortFieldParameterName' => 'date',
'sortDirectionParameterName' => 'desc'
]
);
return $this->render('frontend/blog/list.html.twig', [
'featuredArticle' => $featuredArticle,
'categories' => $categoryRepository->findAll(),
'pagination' => $pagination,
'category' => $category,
]);
}
#[Route('/articolo/{slug}', name: '_article_read', methods: ['GET'])]
#[Route('/{category}/{slug}', methods: ['GET'])]
public function read(string $slug, EntityManagerInterface $entityManager, ?string $category = null): Response
{
if (null === $articleObject = $entityManager->getRepository(Article::class)->findOneBy(['slug' => $slug])) {
throw $this->createNotFoundException();
}
$relatedArticles = $entityManager->getRepository(Article::class)
->createQueryBuilder('article')
->andWhere('article.id != :article')
->setParameter('article', $articleObject->getId())
->setMaxResults(4)
->orderBy('article.date', 'DESC')
->getQuery()->getResult();
return $this->render('frontend/blog/article.html.twig', [
'article' => $articleObject,
'relatedArticles' => $relatedArticles,
]);
}
}