我只是无法扩展Symfony2 Form类。尝试了一切

时间:2014-09-29 15:47:39

标签: php symfony symfony-2.3

我已经尝试了一切来尝试扩展Symfony2 Form类。

我想在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添加到Form类 - 我不能这样做 - 或者添加的方法将无法使用$ 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是唯一的选择。

1 个答案:

答案 0 :(得分: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;
            }
        }