<?php
namespace App\Controller\Content\App;
use App\Entity\Content\Blog;
use App\Repository\Content\BlogCommentRepository;
use App\Repository\Content\BlogRepository;
use HttpInvalidParamException;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration as Ctrl;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Class BlogController
*
* @package App\Controller\Content\App
*
* @Route("/{_locale}/blog", requirements={"_locale": "\w{2}"})
*/
class BlogController extends AbstractController
{
/**
* @Route("/index", name="mdl_public_blog_index")
*
* @Ctrl\Cache(expires="+2 days", public=true)
*/
public function indexAction(
Request $request,
PaginatorInterface $paginator,
BlogRepository $blogRepository
): Response {
if ('/_fragment' === $request->getPathInfo()) {
return $this->render('Content/Public/Blog/index.ajax.twig', [
'blog' => $blogRepository->findByLocale($request->getLocale()),
]);
}
return $this->render('Content/Public/Blog/index.html.twig', [
'blog' => $paginator->paginate(
$blogRepository->createByLocaleQueryBuilder($request->getLocale()),
(int) $request->get('page', 1),
(int) $request->get('itemsPerPage', 6)
),
]);
}
/**
* @Route("/by_type/{type}", name="mdl_public_blog_by_type")
* @Route("/by_type/{type}/{maxResults}")
*
* @Ctrl\Cache(Etag="type", expires="+2 days", public=true)
*/
public function byTypeAction(
Request $request,
string $type,
PaginatorInterface $paginator,
BlogRepository $blogRepository
): Response {
if (!isset(Blog::TYPES[$type])) {
throw new HttpInvalidParamException('Blog type invalid');
}
if ('/_fragment' === $request->getPathInfo()) {
return $this->render('Content/Public/Blog/by_type.ajax.twig', array(
'posts' => $blogRepository
->findByType(
Blog::TYPES[$type],
$request->getLocale(),
$request->get('maxResults', 15)
)
->getQuery()
->getResult(),
'type' => $type,
'fragment' => true,
'types' => array_flip(Blog::TYPES),
));
}
return $this->render('Content/Public/Blog/by_type.html.twig', [
'posts' => $paginator->paginate(
$blogRepository->createByTypeQueryBuilder(Blog::TYPES[$type], $request->getLocale()),
(int) $request->get('page', 1),
(int) $request->get('itemsPerPage', 10)
),
'type' => $type,
'types' => array_flip(Blog::TYPES),
]);
}
/**
* @param Blog $post
*
* @Route("/{slug}", name="mdl_public_blog_view")
*
* @Ctrl\Cache(Etag="post.getId() ~ post.getUpdatedAt().getTimestamp()", expires="+2 days", lastModified="post.getUpdatedAt()", public=true)
*
* @Ctrl\ParamConverter("post", class="App\Entity\Content\Blog", options={
* "mapping": {"slug": "slug", "_locale": "locale"},
* "repository_method" = "findOneBySlug",
* "map_method_signature" = true
* })
*
* @return Response
*/
public function viewAction(Blog $post): Response
{
return $this->render('Content/Public/Blog/post.html.twig', [
'post' => $post,
]);
}
/**
* @Route("/{slug}/similar", name="mdl_public_blog_similar")
*
* @Ctrl\Cache(Etag="blog.getId() ~ blog.getUpdatedAt().getTimestamp()", expires="+2 days", lastModified="blog.getUpdatedAt()", public=true)
*
* @Ctrl\ParamConverter("blog", class="App\Entity\Content\Blog", options={
* "mapping": {"slug": "slug", "_locale": "locale"},
* "repository_method" = "findOneBySlug",
* "map_method_signature" = true
* })
*/
public function similarAction(
Request $request,
PaginatorInterface $paginator,
BlogRepository $blogRepository,
Blog $blog
): Response {
return $this->render('Content/Public/Blog/sidebar.html.twig', [
'blog' => $paginator->paginate(
$blogRepository->createByCategoryQueryBuilder($request->getLocale(), $blog->getCategory()->getId()),
(int) $request->get('page', 1),
(int) $request->get('itemsPerPage', 3)
),
]);
}
/**
* @Route("/{slug}/comments", name="mdl_public_blog_comments")
*
* @Ctrl\Cache(Etag="blog.getId() ~ blog.getUpdatedAt().getTimestamp()", expires="+2 days", lastModified="blog.getUpdatedAt()", public=true)
*
* @Ctrl\ParamConverter("blog", class="App\Entity\Content\Blog", options={
* "mapping": {"slug": "slug", "_locale": "locale"},
* "repository_method" = "findOneBySlug",
* "map_method_signature" = true
* })
*/
public function viewCommentsAction(
Blog $blog
): Response {
return $this->render('Content/Public/Blog/comments.html.twig', [
'comments' => $blog->getComments(),
]);
}
}