SymfonyのForm
SymfonyのForm
用語や構造が複雑すぎる
docs
best practices
訳してる人がいる
最初に読むと流れが掴めて良いかも
3行俯瞰
SymfonyのformBuilder
FormObjectを定義するもの
formの実装方法は2つあるが基本的にはFormTypeを使う
SymfonyのFormObject
Symfonyの仕組み上formを作るときに必要なObject
SymfonyのFormType
ここでfieldの定義, Entityとのmapping, validationの記述などをする
基本的にはHogeTypeのような名前のclass
buildForm()の中で$builder->add()->add()->..で構成していくなど
ややこしいが、fieldの一つ一つもFormTypeである
コレを忘れると頭がバグるmrsekut.icon
SymfonyのBuilt-in Form Types
defaultで用意されているfieldとして使うFormTypes
CollectionTypeやTextTypeなど
SymfonyのForm Type Extension
既存のFormTypeを外部から拡張したいときに使う
SymfonyのAbstractType
FormTypeが継承するclass
SymfonyのData Transformers
userがfieldに入力した値を、別の形式に変換したいときに使う
SymfonyのForm Events
「データがセットされたとき」「submitしたとき」とかに実行したい処理を記述する
Symfonyのform Validation
validationを書く方法について。
SymfonyでFormを作る
SymfonyのformBuilderを作る
addの連鎖などを書く
SymfonyのFormObjectを作るためのbuilderの定義
SymfonyのformBuilder
builderからcreateFormしてform objectを作る
このタイミングでsubmit処理も書くの?
form objectをViewに返却する
Viewはそのform objectを使って、フォームを構築する
ここも何種類かある
1行で全ての要素を表示する
個別の要素を1つ1つ表示する
form_startを使ったり、使わなかったり
etc.
#??
AbstractTypeExtensionを継承するやつと、AbstractTypeを継承するやつの差はなに?
submitのための処理も複数個ある
Docsに書いている方法
formを表示する処理と、submitされたものを扱う処理を同じ1つのactionに書く
何でこんな仕様やねんmrsekut.icon
Controllerで別途request先を作る方法
なんとなくこっちのほうが良い気がしている
formタグ
nameとacitonはどう指定する?
Controlllerとの関係
table:a
Controllerのannotation formタグの属性
name action内のurl('')
Validation Rule
Entityのperopertyに@Assertアノテーションを書くとそれができようされるらしい
これはいいかもねmrsekut.icon
validation ruleをform用に別途書かなくていい
https://symfony.com/doc/3.4/forms.html#form-validation
viewの作り方も一つに決まらない
FormObjectをどこまで利用するかの差がある
form_startのような関数が用意されており、そこにFormObjectを渡せば、formタグに変換される仕組み
あまり柔軟性がないイメージがある
良くない抽象化、という感じがするmrsekut.icon
生成されるものと全く同じものを手動で書けば同じ動作になる
form_startを使うかどうか
使わないなら自分でformタグを追加し、name属性を指定する
そのnameのRouteであるcontrollerのactionを作ればいい
code:twig
<form
name="form{{ productClass.id }}"
action="{{ url('hoge_form', {id:product.id }) }}"
method="post"
...</form>
code:controller.php
/**
* @Route("/products/{id}", name="hoge_form", methods={"POST"}, requirements={"id" = "\d+"})
* @ParamConverter("ProductClass", options={"mapping"={"productClassId"="id"}})
*/
public function hogeSubmit(Request $request, Product $Product, ProductClass $ProductClass) {
...
}
こっちのやり方のほうが正しい実装になりそう
VIew側
createViewしてアクセスする
code:twig
{{ form_widget(productForm.createView.quantity, {'attr': {'class': 'quantitySelectForm__input quantity'}}) }}
https://code.74th.net/entry/2019/03/27/165819
ざっくりわかりやすい
v2だが
#??
「お気に入りボタン」を実装するときにもわざわざformタグを使うの?
EventDispatcherってなに
https://symfony.com/doc/current/components/event_dispatcher.html