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

时间:2015-07-04 17:31:41

标签: symfony dependency-injection

我需要将数据提交到注册为服务的自定义类中的控制器外部的FormTypeFormType本身也注册为服务并注入我的自定义类(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的类中使用该表单,所以没有这样的选项

2 个答案:

答案 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(...);)。