121 lines
3.2 KiB
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()
|
|
;
|
|
}
|
|
}
|