LoginSignup
0
1

More than 1 year has passed since last update.

Symfony4でFormTypeを使って、Formの送信を行う。

Last updated at Posted at 2021-06-19

今回作成する予定のテーブル

Item(商品)テーブル

項目名 日本語名 必須
id ID(連番) 文字列
name 商品名 文字列
price 価格 数字 ×
remarks 備考 文字列 ×

まずはエンティティの作成。

$ php bin/console make:entity

そしてFormを作成

$ php bin/console make:form Item

 The name of Entity or fully qualified model class name that the new form will be bound to (empty for none):
 > Item
I?[K?7?[30;47mtem?[39;49m?8t?[K?7?[30;47mem?[39;49m?8e?[K?7?[30;47mm?[39;49m?8m?[K?7?8

 ?[34mcreated?[39m: src/Form/ItemType.php

 ?[37;42m          ?[39;49m
 ?[37;42m Success! ?[39;49m
 ?[37;42m          ?[39;49m

 Next: Add fields to your form and start using it.
 Find the documentation at ?[33mhttps://symfony.com/doc/current/forms.html?[39m

以下にファイルが作成されることを確認

src/Form/ItemType.php

マイグレーションの作成

$ php bin/console make:migration

マイグレーションの実行
(質問にはyesで大丈夫)

$ php bin/console doctrine:migrations:migrate

テーブルが作成されたことを確認。

Controllerも作成しておく。
※ItemController

$ php bin/console make:controller

ItemTypeのbuildFormの中身を編集する

src/Form/ItemType.php
class ItemType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, array(
                'label' => '商品名',
            ))
            ->add('price', IntegerType::class, array(
                'label' => '価格',
                'required'   => false,
            ))
            ->add('remarks', TextareaType::class, array(
                'label' => '備考',
                'required'   => false,
            ))
            ->add('保存', SubmitType::class, array())
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Item::class,
        ]);
    }
}

ItemControllerにcreateメソッドを作成しておく。

src/Controller/ItemController.php
    /**
     * @Route("/item/create", name="item_create")
     */
    public function create(Request $request): Response
    {
        $item = new item();
        $form = $this->createForm(ItemType::class, $item);

        if ($request->getMethod() == 'POST') {
            $form->handleRequest($request);
            $item = $form->getData();
            $manager = $this->getDoctrine()->getManager();
            $manager->persist($item);
            $manager->flush();
            return $this->redirect('/item');
        } else {
            return $this->render('item/create.html.twig', [
                'title' => 'Item作成',
                'form' => $form->createView(),
            ]);
        }
    }

create.html.twigに「{{ form(form) }}」の記述を追加する。

templates/item/create.html.twig
<div class="example-wrapper">
    <h2>{{ title }}</h2>

    {{ form(form) }}
</div>

Formから新しいデータが作成できることを確認。

おまけ

編集と削除のメソッドも下記に記述しておく。
(テンプレートは同じで問題なし)

src/Controller/ItemController.php
    /**
     * @Route("/item/update/{id}", name="item_update")
     */
    public function update(Request $request, Item $item): Response
    {
        $form = $this->createForm(ItemType::class, $item);

        if ($request->getMethod() == 'POST') {
            $form->handleRequest($request);
            $item = $form->getData();
            $manager = $this->getDoctrine()->getManager();
            $manager->flush();
            return $this->redirect('/item');
        } else {
            return $this->render('item/create.html.twig', [
                'title' => 'Item更新',
                'form' => $form->createView(),
            ]);
        }
    }

    /**
     * @Route("/item/delete/{id}", name="item_delete")
     */
    public function delete(Request $request, Item $item): Response
    {
        $form = $this->createForm(ItemType::class, $item);

        if ($request->getMethod() == 'POST') {
            $form->handleRequest($request);
            $item = $form->getData();
            $manager = $this->getDoctrine()->getManager();
            $manager->remove($item);
            $manager->flush();
            return $this->redirect('/item');
        } else {
            return $this->render('item/create.html.twig', [
                'title' => 'Item削除',
                'form' => $form->createView(),
            ]);
        }
    }
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1