如何在Symfony 2中的自定义类中创建和使用表单

如何在Symfony 2中的自定义类中创建和使用表单,symfony,dependency-injection,Symfony,Dependency Injection,我需要将数据提交到注册为服务的自定义类中控制器外部的FormType。FormType本身也被注册为服务,并被注入到我的自定义类中(apiressemapper)。这是一个简化的代码段: 类响应映射器 { 私人$BestSellerListType public function mapResponse($response) { $form = $this->bestSellerListsType; $form->submit($response); } publi

我需要将数据提交到注册为服务的自定义类中控制器外部的
FormType
FormType
本身也被注册为服务,并被注入到我的自定义类中(
apiressemapper
)。这是一个简化的代码段:

类响应映射器 { 私人$BestSellerListType

public function mapResponse($response)
{
    $form = $this->bestSellerListsType;
    $form->submit($response);
}

public function __construct(BestsellerListType $bestSellerListsType)
{
    $this->bestSellerListsType = $bestSellerListsType;
}
}

表单上不存在
submit()
方法

如何正确初始化表单,以便访问
submit()
方法

如果表单在控制器中使用,我可以访问
createForm
方法并执行以下操作:

$form=$this->createForm(“我的表单即服务”)


由于我试图在一个不扩展
控制器的类中使用表单,因此没有这样的选项

您需要
表单工厂
像在控制器中那样处理自定义表单类型。除了您的表单之外,将表单工厂注入到您的服务中:

arguments: [@your_form, @form.factory]
然后像在控制器中一样使用
创建
方法:

$this->formFactory->create(new MyType(), $data, $options);

顺便说一句,Symfony在控制器中使用
facade
设计模式,让您轻松访问各种数据。您只需检查控制器方法的实现,自己也可以这样做

我想如果有人想在服务配置中使用
form.factory
创建表单,我会发布另一条消息(
services.yml
):

这样,在对象实例化时调用工厂方法。然后,您就可以在
api\u response\u mapper
中使用该表单,并且无需手动调用工厂(
$this->formFactory->create(…);

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]