deblan.io-murph/src/Controller/Blog/PostController.php

121 lines
3.2 KiB
PHP

<?php
namespace App\Controller\Blog;
use App\Core\Annotation\UrlGenerator;
use App\Core\Controller\Site\PageController;
use App\Core\Site\SiteRequest;
use App\Entity\Blog\Category;
use App\Entity\Blog\Post;
use App\Repository\Blog\PostRepositoryQuery;
use App\UrlGenerator\PostGenerator;
use Symfony\Component\HttpFoundation\Response;
use App\Core\Site\SiteStore;
use Symfony\Component\HttpFoundation\Request;
class PostController extends PageController
{
protected PostRepositoryQuery $postQuery;
public function __construct(PostRepositoryQuery $postQuery, SiteRequest $siteRequest, SiteStore $siteStore)
{
parent::__construct($siteRequest, $siteStore);
$this->postQuery = $postQuery;
}
/**
* @UrlGenerator(service=PostGenerator::class, method="post")
*/
public function post(Post $post, string $slug): Response
{
if (Post::DRAFT === $post->getStatus() && !$this->getUser()) {
throw $this->createNotFoundException();
}
if ($slug !== $post->getSlug()) {
return $this->redirectToRoute(
$this->siteRequest->getNode()->getRouteName(),
[
'post' => $post->getId(),
'slug' => $post->getSlug(),
]
);
}
return $this->defaultRender('blog/post/post.html.twig', [
'post' => $post,
]);
}
public function posts(int $page = 1): Response
{
$entities = $this->createQuery()
->paginate($page, 5)
;
return $this->defaultRender('blog/post/posts.html.twig', [
'pager' => $entities,
]);
}
public function search(Request $request, int $page = 1): Response
{
$query = $request->query->get('query');
if ($query) {
$entities = $this->createQuery()
->search($query)
->paginate($page, 5)
;
}
return $this->defaultRender('blog/post/search.html.twig', [
'pager' => $entities ?? null,
'query' => $query,
]);
}
/**
* @UrlGenerator(service=PostGenerator::class, method="category")
*/
public function category(Category $category, string $slug, int $page = 1): Response
{
$entities = $this->createQuery()
->inCategory($category)
->paginate($page, 5)
;
if (!$category->getIsActive() && !$this->getUser()) {
throw $this->createNotFoundException();
}
if ($slug !== $category->getSlug()) {
return $this->redirectToRoute(
$this->siteRequest->getNode()->getRouteName(),
[
'category' => $category->getId(),
'slug' => $category->getSlug(),
]
);
}
return $this->defaultRender('blog/post/category.html.twig', [
'category' => $category,
'pager' => $entities,
]);
}
public function tag(string $tag, int $page = 1): Response
{
}
public function createQuery(): PostRepositoryQuery
{
return $this->postQuery->create()
->orderBy('.publishedAt', 'DESC')
->published()
;
}
}