1

我正在尝试将会话数据放入我的表单中,但我不知道该怎么做。

我可以将它传递给我的 FormType 的构造函数,但实际使用会话的 FormType在主窗体中嵌套了 3 层。所以我认为在每个表单类型的每个构造函数中传递会话对象是很脏的,如下所示:

->add('name', new NestedFormType($this->session))

我还考虑过使用 formsType 作为服务。因此,我将为每个应该注入会话的 formsType 都有一个父级。

但是,如果不将所有表单定义为服务,我怎么能做到这一点?

此外,我无法访问DIC我的 FormTypes 的内部。因此,可以创建第一个 formType 对象(在可以访问的控制器中创建)DIC),但嵌套的 FormTypes 不能从它们的父级实例化。

有干净的解决方案吗?

4

2 回答 2

1

您需要将此父表单定义为服务并将会话作为参数传递。

看这个问题:Create a form as a service in Symfony2

于 2012-12-13T20:02:58.270 回答
0

只要您通过别名引用内部注入的表单类型,就不需要为更高级别的表单类型定义服务:

NestedFormType 服务定义:

nested.form.type:
    class: Type\NestedFormType
    tags:
        - { name: form.type, alias: nested_form }
    arguments: [ @security.context ]

嵌套表单类型:

class NestedFormType extends AbstractType
{
    private $security_context;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // do something with $this->security_context
    }

    public function getName()
    {
        return 'nested_form';
    }
}

父窗体类型:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('name', 'nested_form'); 
    // 'nested_form' matches service definition and NestedFormType::getName()
}
于 2013-03-22T23:43:02.847 回答