Because We Love Happy Coding

フリーライターからエンジニア × 講師。発信力だけあり余ってる感じ

なぜSymfonyのフォームは融通が効かないか

今日もまたコーディング。だって僕らはHappy Codingが大好きだから。

Symfony2のフォームの仕組みはけっこう複雑だ。

  • FormType 、FormBuilder、FormViewといった段階的なフォーム生成
  • ModelData、NormData、ViewDataという三段階のデータ構造
  • handleRequest() した後は値を変更できない
  • Entity のプロパティとのひもづけ

関与するクラス、メソッドも多いし、ルールも多い。効率よくトラブルなくフォームを扱うためにはいろいろ必要、というのは、次第に分かってはくるものの、学習コストの高さはいかんともしがたい。

融通を効かせたい場面もある

動的に生成、というほど大げさな話でなかったとしても、場合に応じてフォームの仕様に融通を効かせたい場面はある。

既存のEntityに紐付けられた2つの必須項目テキスト'hoge' 'fuga' があるとする。プラグインによって、これをAコースとし、フォームを減らしたBコースCコースを作りたい。Aコースでは入力必須項目は'hoge' 'fuga' 、Bコースでは'hoge'、Cコースでは入力必須項目はなし。

恐らく普通は、ドロップダウンメニューで選んだコースに合わせて、'hoge' 'fuga' をdisplay:noneにすることで使い分けようとする。

ところがSymfony2は頑強にこれを認めない(ように見える)。

  1. Cコースでフォームを保存しようとすると画面が動かない。よくよく調べるとdisplay:noneにしたフォームがrequiredで「値がないので保存できない」ことがわかる(しかもdisplay:noneなのでエラー表示も画面に出ない!)
  2. それでは、とrequiredを外そうとするとできない。データベースの'hoge' 'fuga' の値はnull不可になっている。

つまりデータベースに手を加えるか、コアコードに手を加えるかしなければならない。それが無理なら、ダミーの値を入れるとか。

たしかにデータベースがnull不可なので筋は通っている。

ただ、プラグイン側から手を加えていくと、データベースからHTMLまで、全長を把握して設計しないといけないし、フォームのルールに縛られるので、初心者は戸惑う。