从Symfony2中的formType访问会话

时间:2012-12-13 08:35:17

标签: php symfony dependency-injection symfony-2.1

我试图将会话数据添加到我的表单中,但我不知道该怎么做。

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

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

我还考虑过使用formsType作为服务。所以我会为每个应该注入会话的formsType创建一个父级。

但是,如果不将我的所有表单定义为服务,我怎么能这样做呢?

此外,我无法访问我的FormTypes中的DIC。因此,创建第一个formType对象(在控制器中创建可以访问DIC)是可以的,但嵌套的FormTypes不能从其父级中获取。

有干净的解决方案吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

NestedFormType服务定义:

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

NestedFormType:

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';
    }
}

ParentFormType:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('name', 'nested_form'); 
    // 'nested_form' matches service definition and NestedFormType::getName()
}