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

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

Item（商品）テーブル

|  項目名  | 日本語名 |  型  |  必須  |
| ---- | ---- |  ---- |  ---- |
|  id  |  ID（連番）  |  文字列 |  〇 |
|  name  |  商品名  |  文字列 |  〇 |
|  price  |  価格  |  数字 |  × |
|  remarks  |  備考  |  文字列 |  × |

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

```bash
$ php bin/console make:entity
```

そしてFormを作成

```bash
$ 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
```

マイグレーションの作成

```bash
$ php bin/console make:migration
```

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

```bash
$ php bin/console doctrine:migrations:migrate
```

テーブルが作成されたことを確認。
![](https://gyazo.com/b0acdbfb41d8ab7581541333f4bda402.png)

Controllerも作成しておく。
※ItemController

```bash
$ php bin/console make:controller
```

ItemTypeのbuildFormの中身を編集する

```php: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メソッドを作成しておく。

```php: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) }}」の記述を追加する。

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

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

### おまけ

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

```php: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(),
            ]);
        }
    }
```