2017-07-20 88 views
0

錯誤#23254在Symfony 3.3.3中修復。其效果是當原始表單方法不是POST或GET時,實際將隱藏的_method添加到表單輸入字段。 _method包含原始表單方法,以便在提交表單時可以恢復它。Symfony 3:http_method_override = true阻止表單驗證

但我有一個包含非POST方法(準確地說setMethod('PUT'))的子窗體。因此,它將_method添加到其參數中,_method將覆蓋父窗體中的POST方法。

由於只有在請求方法與表單方法匹配時才驗證表單,所以更改請求方法無法驗證父表單。

這裏是一個下調示例代碼:

class PartnerType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->setMethod('POST') 
      ->add('partnerRoles', CollectionType::class, array(
       'entry_type' => PartnerRoleType::class, 
      )); 
    } 
} 

class PartnerRoleType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->setMethod('PUT') 
     ; 
    } 
} 

由於升級到Symfony的3.3.5,在PartnerType形式不驗證任何更多作爲$request->method()返回「PUT」由於ParterRoleType加入_method場並且PartnerType表單期待「POST」方法。

我通過配置http_method_override爲false來保留POST方法,但它破壞了真正使用PUT的窗體。通過這些表單,該方法在網頁中被POST取代,但_method未被處理以在提交表單時回到真正的PUT。

如果窗體是父窗體的一部分,我預計不會添加_method輸入字段。這是一個Symfony錯誤還是我錯過了一些東西?

回答

0

這實際上是Symfony中的一個錯誤。當子窗體調用form_rest()時,不應添加其隱藏的_method

從版本2.7.30,2.8.23,3.2.10和3.3.3開始的Symfony受影響(請參閱https://github.com/symfony/symfony/pull/23254)。

A patch正在撰寫之時正在處理中。