render('book/index.html.twig', [ 'books' => $bookRepository->findAll(), ]); } #[Route('/new', name: 'app_book_new', methods: ['GET', 'POST'])] public function new(Request $request, BookRepository $bookRepository): Response { $book = new Book(); $form = $this->createForm(BookType::class, $book); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $bookRepository->add($book, true); $bookRequest = $request->request->all('book'); if (!empty($bookRequest['cover_url'])) { file_put_contents( $this->getParameter('book_covers') . 'cover_' . $book->getId() . '.jpg', file_get_contents($bookRequest['cover_url']) ); } else { $cover = $request->files->get('book')['cover']; if ($cover) { $cover->move( $this->getParameter('book_covers'), 'cover_' . $book->getId() . '.' . $cover->guessClientExtension() ); } } $ebook = $request->files->get('book')['ebook']; if ($ebook) { $ebook->move( $this->getParameter('book_files'), 'ebook_' . $book->getId() . '.' . $ebook->guessClientExtension() ); } return $this->redirectToRoute('app_book_index', [], Response::HTTP_SEE_OTHER); } return $this->renderForm('book/new.html.twig', [ 'book' => $book, 'form' => $form, ]); } #[Route('/search/{phrase}', name: 'app_book_search', methods: ['GET'])] public function search(string $phrase): JsonResponse { $bookFinder = new BookFinder(); return new JsonResponse($bookFinder->search($phrase)); } #[Route('/info/{urlInBase64}', name: 'app_book_info', methods: ['GET'])] public function info(string $urlInBase64): JsonResponse { $bookFinder = new BookFinder(); return new JsonResponse($bookFinder->byUrl(base64_decode($urlInBase64))); } #[Route('/{id}', name: 'app_book_show', methods: ['GET'])] public function show(Book $book): Response { return $this->render('book/show.html.twig', [ 'book' => $book, ]); } #[Route('/{id}/edit', name: 'app_book_edit', methods: ['GET', 'POST'])] public function edit( Request $request, Book $book, BookRepository $bookRepository, FileRepository $fileRepository ): Response { $form = $this->createForm(BookType::class, $book); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $cover = $request->files->get('book')['cover']; if ($cover) { $cover->move( $this->getParameter('book_covers'), 'cover_' . $book->getId() . '.jpg' ); } /** @var \Symfony\Component\HttpFoundation\File\UploadedFile[] $ebooks */ $ebooks = $request->files->get('book')['ebook']; if (count($ebooks) > 0) { foreach ($ebooks as $ebook) { $file = new File(); $file->setFileName(trim($ebook->getClientOriginalName())); $file->setFileSize($ebook->getSize()); $file->setExtension($ebook->guessClientExtension()); $file->setBook($book); $fileRepository->add($file, true); $ebook->move( $this->getParameter('book_files'), 'ebook_' . $book->getId() . '_' . md5($file->getFileName()) . '.' . $file->getExtension() ); } } $bookRepository->add($book, true); return $this->redirectToRoute('app_book_edit', ['id' => $book->getId()], Response::HTTP_SEE_OTHER); } return $this->renderForm('book/edit.html.twig', [ 'book' => $book, 'form' => $form, ]); } #[Route('/{id}', name: 'app_book_delete', methods: ['POST'])] public function delete(Request $request, Book $book, BookRepository $bookRepository, FileService $fileService): Response { if ($this->isCsrfTokenValid('delete' . $book->getId(), $request->request->get('_token'))) { $fileService->removeFiles($book->getFiles()); $bookRepository->remove($book, true); } return $this->redirectToRoute('app_book_index', [], Response::HTTP_SEE_OTHER); } }