Symfonyの
Formあれこれ
Symfony 勉強会 #9

岡田祐一 @okapon_pon
自己紹介
• 名前:岡田祐一 (@okapon_pon)
• 所属:株式会社クロコス エンジニア
• 2013年∼ 日本Symfonyユーザー会
• Symfony歴 2年ほど
私とSymfony
• 2011年 7月 Symfony2.0 リリース そして出会う
• 2011年 9月 Symfony作業場(翻訳会)に参加
• 2011年 12月 Symfony勉強会#5の前夜祭に参加
• 2012年 6月 Symfony勉強会 #6 スタッフとして参加
• 2012年 10月 Symfony温泉 (ドキュメント翻訳)
• 2013年 5月 Symfony勉強会 #8 ワークショップ講師
• 2013年 11月 Symfony作業場(翻訳会)
前回のワークショップ
Symfony勉強会 #8



サンプルコード (ver. Symfony2.2)
https://github.com/okapon/symfony-
workshop/wiki
今日のお話
フォーム(Form)
内容
• Symfony Formの特徴
• Formあれこれ (Tips)
Symfony Form 特徴
• 高度な抽象化
• さまざまな FormType
• プレゼンテーションレイヤーの分離
• DIへの統合
• Validationの組み込み
柔軟なモデルバインディング
• モデルに依存しないデータバインディング
• プレゼンテーション層とドメイン層の分離
Data Transformers
• Entity Valueへ変換
• プレゼンテーション層とドメイン層の分離
拡張性
• FormExtension
• Symfony DIでうまく統合
イベント駆動
• EventDispatcherを内包
• 動的にフォームを組立可能
!
各種イベント
• PRE_SET_DATA
• POST_SUBMIT
など
Formあれこれ(Tips)
このフォームどう実装したらいいの?
Twigでformの値を得るには?
規約への同意を確認したい
例)利用規約への同意確認
規約への同意を確認したい
• フォームにagreementというcheckboxフィールドを
定義
• mapped オプションfalseでデータオブジェクトには

マッピングしない
規約への同意を確認したい
• バリデーションを行うコールバック関数を
EventListenerに登録
※ FormEventsやFormErrorなどのクラス
をインポートする必要がある
カスタムFormFieldType
• 再利用可能にする
カスタムFormFieldType
定義
!
利用 alias指定
Delete機能でCSRF対策
例) 記事情報を削除する機能
Formの CSRF Protection 機能を使って
CSRF対策を行う!
 記事情報をDBから削除するAction
Delete機能でCSRF対策
CSRF対策
Twig関数化しとくと便利
テンプレート側
!
!
loopの中で出したい場合
deleteでCSRF対策
20
Twig で使える Form変数
21
各種フォーム変数へは、
form.フィールド名.vars.変数名
でアクセスできる
先ほどのCSRFの例では form._token.vars.value
• value: フィールドにセットされている値
• label: labelに表示される値
• id: HTMLに表示される際のid属性
• required: required属性
など
Twigで使える Form変数
22
その他フォーム変数はこちら
http://symfony.com/doc/current/reference/forms/
twig_reference.html#twig-reference-form-variables
Twigで使える Form変数
23
required属性がついているlabelタグには自動で
*印をつけたい!
(応用編)カスタムテンプレート化
Formのカスタムテンプレート
24
作成の詳しい方法はこちら
http://docs.symfony.gr.jp/symfony2/cookbook/
form/form_customization.html
画像を選択させたい
例)ECサイトで商品を選択させたい
 Twigでつかう変数を工夫する!!
Delete機能でCSRF対策
画像を選択させたい
FormType側
画像を選択させたい
テンプレート側
• form.itemに forでアクセス(選択項目のFormViewを取り
出す)
• form_widget(item)を使って必要なradio boxを表示する
• item.vars.labelには Itemインスタンスが入ってます
まとめ
!
• Formはモデルに依存せず柔軟にマッピングで
きる
• 拡張性が提供されている
• FormViewが分かれば色々できるようになる!
ご清聴ありがとうございました

Symfony勉強会#9 form