如何使用定义为服务的表单将数组数据映射到Symfony2实体


How to map array data to a Symfony2 entity using a form defined as a service?

我需要将数组形式的数据映射到实体。数据不是来自请求,而是由应用程序从远程源获取的。

我想使用表单将数据映射到实体。这就是我如何将表单作为服务实例化并将其传递给我的自定义类(ApiResponseMapper):

book_form_type:
    class: Air'BookishBundle'Form'Type'BookType
    name:
        - { name: form.type, alias: book_type }
book_form:
    factory_service: form.factory
    factory_method: create
    class: Symfony'Component'Form'Form
    arguments: [@book_form_type]
api_response_mapper:
    class: Air'BookishBundle'Lib'ApiResponseMapper
    arguments: [@bestseller_list_form, @book_form]

ApiResponseMapper中,我希望能够将数据映射到数组中:

public function mapResponse($response)
{
    $form = $this->bookForm; // bookForm is a now a memeber of this class.
    $form->submit($response);
}

这不会将$response(数组数据)映射到我的Book实体(bookFormBook类设置为data_class)。我从Symfony开始,我真的不确定如何使用这个表单来映射$response。"传统"方法是在控制器中调用类似这样的东西:$form = $this->createForm(new BookType(), $Book);,但正如您所看到的,这种情况是不同的。

我需要绕过handleRequest(),手动调用submit()。在此场景中,如何将数据映射到实体上?

解决方案相当简单。也许将来它能帮到别人。我的方法是这样的:

public function mapResponse($response)
{
    $Book = new Book();
    $form = $this->bookForm;
    $form->setData($Book);
    $form->submit($response);
    return $Book;
}

被映射到的类应该被实例化并作为参数传递给在form对象上调用的setData()。请注意,这个特定的示例没有对表单.

使用数据验证。