symfony勉強会#9 form
TRANSCRIPT
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が分かれば色々できるようになる!
ご清聴ありがとうございました