UUUM攻殻機動隊(エンジニアブログ)

UUUMのエンジニアによる技術ブログです

Symfonyの基本的なフォーム関数

こんにちは、村上です。 @malloc007
最近はwordpressばかり触っておりますが、今日はSymfonyの入門記事を書こうと思います。

Symfonyでフォームを作る時、
twigファイルではControllerで渡したformオブジェクトをフォーム関数(ヘルパー)に渡して入力項目を展開していきますが、
慣れるまでそれぞれの違いがわかりにくいです。

ここでは3つの基本的なフォーム関数の使い方を紹介します。

環境

  • Symfony 2.7.8

1. <form>タグごとまるごと簡易表示

  • form()
      // formタグまるごと
      {{ form(form, {'method': 'post'}) }}

f:id:ryota-murakami:20160112201035p:plain

こちらは<form>タグをまるごと展開します。
表示を細かくカスタマイズ出来ないので開発中の使用のみに留めると良いでしょう。

2. 入力項目別に出力

  • form_row()
        // <form>開始タグ
        {{ form_start(form, {'method' : 'post', 'action': path('confirm')}) }}
      
         // タイトル
        {{ form_row(form.title, {'attr':{'class':'form-control'}}) }}
        
        // 本文
        {{ form_row(form.body, {'attr':{'class':'form-control'}}) }}
        
        // カテゴリー
        {{ form_row(form.category, {'attr':{'class':'form-control form-control-lg'}}) }}

        <button type="submit" class="btn btn-primary" name="button">投稿</button>

        // </form>閉じタグ
        {{ form_end(form) }}

f:id:ryota-murakami:20160112201104p:plain

こちらは入力項目を構成するフォーム要素がまとめて展開されます。
今回は紹介しませんが、twigのform_themeというページ毎にフォーム要素をカスタマイズ出来る機能を使うと、
form_row()で展開される各要素を自由に変更する事ができます。

3. フォーム要素別に出力

  • form_label()
  • form_widget()
  • form_errors()
        {{ form_start(form, {'method' : 'post', 'action': path('confirm')}) }}

        {{ form_label(form.title, 'title') }} // ラベル
        {{ form_widget(form.title, {'attr':{'class':'form-control'}}) }} // 入力
        {{ form_errors(form.title) }} // エラー文言

        {{ form_label(form.body, 'body') }}
        {{ form_widget(form.body, {'attr':{'class':'form-control'}}) }}
        {{ form_errors(form.body) }}

        {{ form_label(form.category, 'category') }}
        {{ form_widget(form.category, {'attr':{'class':'form-control form-control-lg'}}) }}
        {{ form_errors(form.category) }}

        <button type="submit" class="btn btn-primary" name="button">投稿</button>

       {{ form_end(form) }}

f:id:ryota-murakami:20160112201106p:plain

これらはラベル、入力、エラー文言を個別に展開します。 form_row()で展開される要素を個別に制御したい場合に有用です。

まとめ

いかがでしたでしょうか。
form()form_row()form_label() form_widget() form_errors()の順にレイヤーが下がって行く事が分かります。
Symfonyを始めたばかりだとフォーム関数を使って自由にスタイリング出来ず、htmlをベタ書きしたい気持ちに駆られるかと思いますが、
基本的な箇所から慣れていきましょう。