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) }}