2014-09-29 67 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; 
      } 
     } 
相关问题