以下、メモです。
MainController.php
名前空間のインポートなどは割愛。
indexメソッド
ブログの一覧表示を行う機能を実装。
1 2 3 4 5 6 7 8 9 10 11 |
/** * @Route("/",name="app_main_index") * * @param BlogRepository $blogRepository * * @return Response */ public function index(BlogRepository $blogRepository) { return $this->render('list.html.twig', ['blogs' => $blogRepository->findAll()]); } |
ブログの一覧を表示するためのメソッド。@Route("/",name="app_main_index")
アノテーションにより、アプリケーションのルートURL(例:http://yourwebsite.com/)にアクセスしたときにこのメソッドが呼び出される。BlogRepository
を引数として受け取り、そのfindAll
メソッドを使ってすべてのブログエントリを取得。取得したブログエントリはTwigテンプレートエンジンを使ってlist.html.twig
テンプレートに渡され、ブラウザに表示される。
createBlogメソッド
ブログの新規作成を行う機能を実装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/** * @Route("/create") * * @param Request $request * * @return Response */ public function createBlog(Request $request, EntityManagerInterface $entityManager, SluggerInterface $slugger) { $form = $this->createForm(BlogFormType::class, new Blog()); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $blog = $form->getData(); $imageFile = $form->get('imageFile')->getData(); if ($imageFile) { $originalFilename = pathinfo($imageFile->getClientOriginalName(), PATHINFO_FILENAME); $safeFilename = $slugger->slug($originalFilename); $newFilename = $safeFilename.'-'.uniqid().'.'.$imageFile->guessExtension(); try { $imageFile->move( $this->getParameter('image_directory'), $newFilename ); } catch (FileException $e) { $this->addFlash('error', 'Image cannot be saved.'); } $blog->setImage($newFilename); } $entityManager->persist($blog); $entityManager->flush(); $this->addFlash('success', 'ブログを作成しました!'); return $this->redirectToRoute('app_main_index'); } return $this->render('create.html.twig', [ 'form' => $form->createView() ]); } |
これは新しいブログエントリを作成するためのメソッド。@Route("/create")
アノテーションにより、アプリケーションの/create URL(例:http://yourwebsite.com/create)にアクセスしたときにこのメソッドが呼び出される。このメソッドはRequest
オブジェクト、EntityManagerInterface
、およびSluggerInterface
を引数として受け取る。Request
オブジェクトはHTTPリクエストの情報を含み、EntityManagerInterface
はデータベース操作を行うためのオブジェクトで、SluggerInterface
は文字列をURLフレンドリーな形式に変換するためのオブジェクト。
createBlog
メソッドでは、まずBlogFormType
というフォームクラスを使ってフォームを作成。次に、handleRequest
メソッドを使ってリクエストデータをフォームにバインド。フォームが送信され、そのデータが有効であることが確認されたら、フォームからブログエントリのデータを取得し、画像ファイルがアップロードされている場合はそのファイルを保存。最後に、ブログエントリをデータベースに保存し、成功メッセージをフラッシュに追加し、ユーザーをブログの一覧ページにリダイレクトする。
※URLフレンドリーな形式とは・・・URL(ウェブアドレス)に適している形式のことを。具体的には、以下のような特性を持つ文字列:
- ASCII文字のみ: URLはASCII文字セットのみをサポートしている。これには英数字(a-z、A-Z、0-9)と一部の記号(-、_、.、~)が含まれる。その他の文字(例えば日本語の文字や特殊記号)はURLエンコードという手法を用いてこれらのASCII文字に変換する必要がある。
- スペースなし: URLにはスペースを含めることができない。スペースは通常、ハイフン(-)やアンダースコア(_)で置き換えられる。
- 小文字化: URLは大文字と小文字を区別するため、一貫性を保つためにすべて小文字にすることが一般的。
- 特殊文字の除去または置換: URLには一部の記号しか含めることができないため、その他の記号は除去されるか、適切な文字に置き換えられる。
SluggerInterface
は、これらのガイドラインに従って文字列を”スラッグ”(URLフレンドリーな文字列)に変換するためのツール。例えば、ブログのタイトルをURLの一部として使用する場合、SluggerInterface
を使用してタイトルをスラッグに変換できる。これにより、ブログのタイトルがURLとして適切に機能し、ウェブブラウザで正しく解釈される。
editBlogメソッド
既存のブログを編集する機能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/** * @Route("/edit/{id}", name="app_main_editBlog") * * @ParamConverter("blog", class="App\Entity\Blog") * * @return Response */ public function editBlog($id, Request $request, EntityManagerInterface $entityManager, SluggerInterface $slugger) { $blog = $entityManager->getRepository(Blog::class)->find($id); $form = $this->createForm(BlogFormType::class, $blog); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $blog = $form->getData(); $imageFile = $form->get('imageFile')->getData(); if ($imageFile) { $originalFilename = pathinfo($imageFile->getClientOriginalName(), PATHINFO_FILENAME); $safeFilename = $slugger->slug($originalFilename); $newFilename = $safeFilename.'-'.uniqid().'.'.$imageFile->guessExtension(); try { $imageFile->move( $this->getParameter('image_directory'), $newFilename ); } catch (FileException $e) { $this->addFlash('error', 'Image cannot be saved.'); } $blog->setImage($newFilename); } $entityManager->persist($blog); $entityManager->flush(); $this->addFlash('success', 'ブログを更新しました!'); return $this->redirectToRoute('app_main_index'); } return $this->render('create.html.twig', [ 'form' => $form->createView(), ]); } |
このメソッドは、既存のブログエントリを編集するためのもの。@Route("/edit/{id}", name="app_main_editBlog")
アノテーションにより、/edit/{id}の形式のURL(例:http://yourwebsite.com/edit/123)にアクセスしたときにこのメソッドが呼び出される。ここで、{id}は編集したいブログエントリのIDを表す。
このメソッドでは、まず指定されたIDのブログエントリをデータベースから取得。次に、そのブログエントリを元にBlogFormTypeというフォームを作成。その後、リクエストデータをフォームにバインドし、フォームが送信され、そのデータが有効であることを確認。データが有効であれば、フォームからブログエントリのデータを取得し、画像ファイルがアップロードされている場合はそのファイルを保存。最後に、ブログエントリをデータベースに保存し、成功メッセージをフラッシュに追加し、ユーザーをブログの一覧ページにリダイレクト。
deleteBlogメソッド
ブログを削除する機能を実装。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/** * @Route("/delete/{id}", name="app_blog_delete") * * @param Blog $blog * @param EntityManagerInterface $em * * @return RedirectResponse */ public function deleteBlog($id, EntityManagerInterface $em): RedirectResponse { $blog = $em->getRepository(Blog::class)->find($id); $em->remove($blog); $em->flush(); $this->addFlash('success', 'ブログを削除しました!'); return $this->redirectToRoute('app_main_index'); } |
:このメソッドは、既存のブログエントリを削除するためのもの。@Route("/delete/{id}", name="app_blog_delete")
アノテーションにより、/delete/{id}の形式のURL(例:http://yourwebsite.com/delete/123)にアクセスしたときにこのメソッドが呼び出される。ここで、{id}は削除したいブログエントリのIDを表す。
このメソッドでは、まず指定されたIDのブログエントリをデータベースから取得。次に、そのブログエントリをデータベースから削除し、成功メッセージをフラッシュに追加。最後に、ユーザーをブログの一覧ページにリダイレクトする。
【補足:routing】アノテーションではうまく実装できずにroutes.yamlで定義
アノテーションではうまくルーティングが通らなかったため(原因は分かっていないです)、一旦routes.yamlでルーティングを設定することに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
index: path: / controller: App\Controller\MainController::index create: path: /create controller: App\Controller\MainController::createBlog app_main_createblog: path: /create controller: App\Controller\MainController::createBlog app_main_index: path: / controller: App\Controller\MainController::index app_main_editblog: path: /edit/{id} controller: App\Controller\MainController::editBlog requirements: id: \d+ app_blog_delete: path: /delete/{id} controller: App\Controller\MainController::deleteBlog requirements: id: \d+ |
【参考サイト】
上記のサイトを基本的になぞりながら、一部コードを変更したりしながら進めました。プロジェクト全体をGithubに置いてくれていたのでそれで全体像を確認したり、あとは公式サイトやその他サイトをググったりしながら完成。