1
0
Fork 0
This repository has been archived on 2024-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
Blog/src/Controller/PostController.php

152 lines
4.9 KiB
PHP

<?php
namespace App\Controller;
use App\Entity\Comment;
use App\Entity\Post;
use App\Form\CommentType;
use App\Form\PostType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\AsciiSlugger;
class PostController extends AbstractController
{
/**
* @Route("/{page}", name="home")
* @param int $page
* @return Response
*/
public function index(int $page = 0): Response
{
$repo = $this->getDoctrine()->getRepository(Post::class);
$pages = (int) round(count($repo->getPublished())/5, 0, PHP_ROUND_HALF_UP);
if ($page < 0) {
$page = 0;
} else if ($page > $pages) {
$page = $pages;
}
return $this->render('home/index.html.twig', [
'posts' => $repo->getPublished($page*5, 5),
'pages' => $pages-1,
'page' => $page
]);
}
/**
* @Route("/post/{slug}", name="post")
* @param Request $request
* @param string $slug
* @return Response
*/
public function post(Request $request, string $slug): Response
{
$post = $this->getDoctrine()->getRepository(Post::class)->findOneBy(array('slug' => $slug));
if (!$post) {
throw $this->createNotFoundException("Post not found");
}
$form = $this->commentFormGenerator($post);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$comment = $form->getData();
$comment->setCreatedAt(new \DateTime());
$manager = $this->getDoctrine()->getManager();
$manager->persist($comment);
$manager->flush();
$form = $this->commentFormGenerator($post);
}
return $this->render('post/index.html.twig', [
'post' => $post,
'form' => $form->createView()
]);
}
/**
* @Route("/admin/posts", name="posts")
*/
public function posts(): Response
{
return $this->render('post/posts.html.twig', [
'posts' => $this->getDoctrine()->getRepository(Post::class)->findBy(array(), array('publishedAt' => 'DESC'))
]);
}
/**
* @Route("/admin/posts/add", name="post-add")
* @param Request $request
* @return Response
*/
public function add(Request $request): Response
{
$post = new Post();
$form = $this->createForm(PostType::class, $post);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$post = $form->getData();
$post->setSlug((new AsciiSlugger())->slug($post->getTitle()));
$manager = $this->getDoctrine()->getManager();
$manager->persist($post);
$manager->flush();
return $this->redirectToRoute('posts');
}
return $this->render('post/posts-form.html.twig', [
'form' => $form->createView(),
'title' => 'Add new post'
]);
}
/**
* @Route("/admin/posts/edit/{slug}", name="post-edit")
* @param Request $request
* @param string $slug
* @return Response
*/
public function edit(Request $request, string $slug): Response
{
$manager = $this->getDoctrine()->getManager();
$post = $manager->getRepository(Post::class)->findOneBy(array('slug' => $slug));
if (!$post) {
throw $this->createNotFoundException("Post not found");
}
$form = $this->createForm(PostType::class, $post);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$post = $form->getData();
$post->setUpdatedAt(new \DateTime());
$post->setSlug((new AsciiSlugger())->slug($post->getTitle()));
$manager->flush();
return $this->redirectToRoute('posts');
}
return $this->render('post/posts-form.html.twig', [
'form' => $form->createView(),
'title' => 'Edit '.$post->getTitle()
]);
}
/**
* @Route("/admin/posts/remove/{slug}", name="post-remove")
* @param string $slug
* @return Response
*/
public function remove(string $slug): Response
{
$manager = $this->getDoctrine()->getManager();
$post = $manager->getRepository(Post::class)->findOneBy(array('slug' => $slug));
if (!$post) {
throw $this->createNotFoundException("Post not found");
}
$manager->remove($post);
$manager->flush();
return $this->redirectToRoute('posts');
}
private function commentFormGenerator(Post $post) : FormInterface
{
$comment = new Comment();
$comment->setPost($post);
return $this->createForm(CommentType::class, $comment);
}
}