Symfony【フォーム】

Symfonyでフォームを作成していきます。

この記事を読んでも難しいときは、まずはSymfony【環境構築とHelloWorld】を確認してください。

Symfonyで作るメリット

・formをTypeとして定義することで流用できる
・DBとformの連携が簡単(別記事で説明します)

ファイル構成

ファイル構成は下記です。

Controllerとtwigはコマンドから生成できますが、FormTypeは手作業で追加してください。

src

Controller

RegisterController.php

Form

RegisterType.php

templates

register

index.html.twig

FormTypeを作る

コントローラーに直接書いても書けるのですが、それだと流用できず、DBとの連携も取りずらくなります。

そのためformはtypeとして定義します。

typeとはclassです。下記のフォーマットを使ってください。

<?php

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class RegisterType extends AbstractType
{
  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $builder
      ->add('change_text', TextType::class, [
        'label' => 'ラベルの文字をここに書きます',
      ])
      ->add('submit', SubmitType::class, array(
        'label' => 'ラベルの文字をここに書きます',
        'attr' => ['class' => 'btn btn-primary'],
      ))
      ->getForm();
  }
}

解説します。

  • namespace
    このクラスを追加するときの場所の名前です。この記述の下でuseとしていますが、このクラスを他のファイルから使いたいときにこのnamespaceを指定します。
  • AbstractType
    このFormTypeを作るときに必要です。
    これはそういうものだと考えてください。身も蓋もないですが、使えるものは使ってなんぼだと思っています。細かいことまで気にしていたらキリがないです。電化製品でも、中身の構造まで知らなくても使えますよね。
  • extends AbstractType
    AbstractTypeを継承しています。おそらく抽象クラスを継承していて、抽象クラスとは抽象的なクラスです(そのまま)。
    継承するとクラスの中身をコピーすることができるのですが、コピー元のメソッドの中身がないパターンがあり、中身は勝手にしてねということです。
    間違っていたらすみません。気になる方はAbstractTypeの中身を見てみましょう。
  • $builder
    フォームビルダーです。ここでフォームが作られています。
    $builder作って、addして、getForm!

    addの第1引数:HTMLのname属性

    addの第2引数:HTMLのinputのtype(typeの種類によってuseで追加する必要があります)
    ※詳細はリファレンスを参照してください
    Form Types Reference

    addの第3引数:arrayでオプションを指定します。これもリファレンスを参照してください。

フォームはこれで完成です。

コントローラーでformを作る

3ステップあります。

作ったFormTypeを使う準備をする
use App\Form\RegisterType;

を追加します。

FormTypeクラスをインスタンス化して渡す
$form = $this->createForm(RegisterType::class);

クラスは設計図です。「設計図からものを作る」という工程が、「インスタンス化する」ということになります。

newでインスタンス化して、それをcreateFormメソッドの第2引数で渡していますね。

第1引数では、RegisterTypeのclassを渡しています。

createFormメソッドの仕様です。

作ったformをtwigに渡す

$formに作ったフォームが入っていますが、このままではtwigに渡せません。

形を整えて、renderメソッドで渡します。

return $this->render('register/index.html.twig', [
            'form' => $form->createView(),
        ]);

formをtwigで表示する

twigに下記を追加します。

キャッシュを消して表示確認してみてください。

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

この記事を書いた人

ホクト

プログラミングと嫁が好き。文系出身ながら機械メーカーで電気設計→Webがしたくて退職を決意→転職。電気設計で役に立つweb知識を中心に書きます。