我已经尝试了一切来尝试扩展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是唯一的选择。
答案 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;
}
}