簡體   English   中英

Symfony表單:如何替換表單類/檢索所有額外數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM