[英]Symfony Form: How to replace form class / retrieve all extra data?
Symfony 2 Form Component確實是一種東西。 我想你知道的。 試圖理解什么是有效的只是一個看似不可能的任務; 我在瀏覽代碼庫時非常有經驗..但是人,Form組件.. OMG
TL; DR
以下是詳細信息,本期試圖提問
\\Symfony\\Component\\Form\\Form
? $form->add('ss', 'form')
它究竟是如何工作的 - 顯然Core\\FormType
類會涉及但是當我稍后檢索它時,它是一個實例\\Symfony\\Component\\Form\\Form
? 這發生在哪里,這可能會覆蓋,所以它在那里使用不同的類? 細節
情況
想象一下,接收深JSON有效負載的Controller。 此有效負載通過Form進行解碼和驗證。 現在,大多數JSON結構都由Models(Doctrine ODM Entities)映射。 但是一些子屬性只是“哈希” - 允許客戶發布他想要的任何內容。
那些“哈希”子屬性是類型形式的字段,是復合標記的,可以有額外的字段。
問題
最重要的是,我們的問題是$form->getData()
不返回所有“額外字段”。 我們無法指定那些字段(及其類型),因為我們不知道會發生什么 - 因此所有這些數據都是extraData的一部分。
解決方案?
所以我想 - 好吧 - 讓我們修改FormFactory,這樣它就會返回我們的Form的自定義擴展 - 一個在調用getData時也返回extraData的擴展。 容易對。 Noo,不容易......
我的想法讓我檢查FormFactory,FormBuilders,ResolvedFormTypes,以及所有重要的地方(比如formBuilder->getForm()
) - 我想要覆蓋/替換的類是instanciated static - 沒有使用DIC .. (!)
我已經讀過Symfony 2中的Form組件是由魔鬼自己寫的,讓我們開發人員發瘋了。 幸運的是,我不那么瘋狂,試圖通過自己更換整個表單組件;)
除了笑話,當你定義一個表單時(通過創建一個<entity>Type
類,比如UserType
),你定義了一個新類型,它可以像單個文本輸入一樣簡單,也可以像完整的表單一樣復雜(我們的UserType
來自之前) )。 “真實”表單( Symfony\\Component\\Form\\Form
)是根據您的類型定義創建的:
return $this->container->get('form.factory')->create(
new UserType(), new User(), $options
);
您是否評估了為“extraData”創建自定義表單類型的想法? 或者它可以映射為在提交之前由客戶端JavaScript創建的JSON字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.