我需要将数据提交到注册为服务的自定义类中的控制器外部的FormType
。 FormType
本身也注册为服务并注入我的自定义类(ApiResponseMapper
)。这是一个简化的代码段:
类ApiResponseMapper { private $ bestSellerListsType;
public function mapResponse($response)
{
$form = $this->bestSellerListsType;
$form->submit($response);
}
public function __construct(BestsellerListType $bestSellerListsType)
{
$this->bestSellerListsType = $bestSellerListsType;
}
}
表单上不存在submit()
方法。
如何正确初始化表单,以便我可以访问submit()
方法?
如果表单在控制器中使用,我可以访问createForm
方法并执行:
$form = $this->createForm('my_form_as_a_service');
因为我试图在不扩展Controller
的类中使用该表单,所以没有这样的选项
答案 0 :(得分:2)
您需要FormFactory
使用自定义表单类型,就像在控制器中一样。除了您的表格注入工厂到您的服务:
arguments: [@your_form, @form.factory]
然后像在控制器中一样使用create
方法:
$this->formFactory->create(new MyType(), $data, $options);
顺便说一下,Symfony在控制器中使用facade
设计模式,让您轻松访问各种数据。您可以检查控制器方法的实现并自己完成。
答案 1 :(得分:0)
我想我会发布另一个,以防有人想要处理在服务配置中创建form.factory
的表单(在我的情况下为services.yml
):
bestseller_list_form_type:
class: Air\BookishBundle\Form\Type\BestsellerListType
name:
- { name: form.type, alias: bestseller_list_form }
bestseller_list_form:
factory_service: form.factory
factory_method: create
class: Symfony\Component\Form\Form
arguments: [@bestseller_list_form_type]
api_response_mapper:
class: Air\BookishBundle\Lib\ApiResponseMapper
arguments: [@bestseller_list_form]
这样,在对象实例化时调用工厂方法。然后,您可以在api_response_mapper
中使用该表单,并且无需手动调用工厂($this->formFactory->create(...);
)。