2014-09-29 62 views
0

我已經從字面上嘗試了所有嘗試並擴展Symfony2 Form類的東西。我只是不能擴展Symfony2 Form類。試了一下

我想添加一個新的方法來形成並調用它的控制器:

$form = $this->createForm($this->get('my_form_service'), $entity); 
$form->myNewMethod(); 

因爲Form類沒有被定義爲一個服務和其他類實例化(FormBuilder,線221)那麼我看不到我能做什麼。我不想破解核心。

我可以擴展控制器類,例如,在的CreateForm()方法返回實例化的Form對象:

// Extend Controller and do something with Form before returning 

public function createForm($type, $data = null, array $options = array()) 
{ 
    return $this->container->get('form.factory')->create($type, $data, $options); 

其實How to add a new method to a php object on the fly?顯示瞭如何能做到以上並加入我的新方法,這種方式,但我的理解是,你需要至少__call添加到表單類 - 我不能做 - 或者添加的方法將不能使用$ this(我需要)。

我只需要在控制器中使用表單時添加此項。我不需要它進行任何CLI處理。

任何想法如何我可以添加一個方法的Form類沒有黑客的核心?

============================================== ======================

編輯:我爲什麼要這樣做?

如果滿足某個條件,我想'默默失敗'表單提交。我認爲,要做到這一點的最好辦法是做這樣一個控制器:

if ($form->isValid()) { 
    if ($form->requiresSilentFail()) { 
     // Silently fail 
    } else { 
     // As normal, add to DB etc. 
    } 
} 

我想我可以做這樣的事情:

if ($form->isValid()) { 
    if ($this->get('check_my_form')->requiresSilentFail($form)) { 
     // Silently fail 
    } else { 
     // As normal, add to DB etc. 
    } 
} 

....但我也需要首先在Form :: handleRequest()中執行一些額外的邏輯,所以我相信擴展Form是唯一的選擇。

+0

我不是對Symfony非常熟悉,但是如果你想擴展類,你可以通過繼承它們(除非它們被聲明爲final,很少做)。難道你不能'類MyForm擴展SymfonyForm'? – GordonM 2014-09-29 15:51:42

+0

子類也是form.factory服務,並用你自己的類替換Form的實例。 – user3557327 2014-09-29 16:25:59

+0

我想你應該用FormEvents或Validator組件來處理 – 2014-09-30 12:24:14

回答

0

我真的不明白爲什麼你需要擴展表單類只需在您的控制器/服務,您處理的形式號召下是你的方法有效的檢查,見下圖:

  $form->handleRequest($request); 
      if ($form->isValid()) { 
       $this->get($apiResource->getResourceHandlerName())->update($resourceData); 
       $response = new Response(); 
       $response->setStatusCode($statusCode); 
       if ($this->isSuccessFullStatusCode($statusCode)) { 
       $serializedObject = $this->getSerializer()->serialize($resourceData, 'json',$serializationContext); 
       $response->setStatusCode($responseStatusCode); 
       $response->setContent($serializedObject); 
       return $response; 
      } 
     } 
相關問題