Доступ к сеансу из formType в Symfony2

Я пытаюсь получить данные сеанса в свои формы, но я не знаю, как это сделать.

Я мог бы передать его конструктору моего FormType, но FormType, который фактически использует сеанс, вложен на 3 уровня глубже в основную форму. Поэтому я думаю, что грязно передавать объект сеанса в каждый конструктор каждого типа формы следующим образом:

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

Я также думал об использовании formType в качестве службы. Таким образом, у меня был бы родитель для каждого из моих типов форм, который должен быть введен с помощью сеанса.

Но как я могу это сделать, не определяя все мои формы как сервисы?

Более того, я не могу получить доступ к DIC внутри моих FormTypes. Итак, это нормально для создания первого объекта formType (который создается в контроллере, который может получить доступ к DIC), но вложенные типы FormType не могут быть созданы из их родителя.

Есть чистое решение?


person Leto    schedule 13.12.2012    source источник


Ответы (2)


Вам нужно определить эту родительскую форму как службу и передать сеанс в качестве аргумента.

посмотрите на этот вопрос: Создайте форму как службу в Symfony2

person Max Małecki    schedule 13.12.2012
comment
Я думал об этом, но как мне создавать дочерние объекты, если их родителем является служба, а они нет? - person Leto; 14.12.2012
comment
Я думаю, вы можете передать все данные, которые вы хотите сформировать конструктору, в параметре параметров :) - person Max Małecki; 14.12.2012
comment
Возможно, но я должен передавать его из формы в форму, пока не достигну той формы, в которой мне нужна сессия. - person Leto; 14.12.2012
comment
Так что забудьте о родителях. Просто создайте встроенную форму как сервис и сделайте это таким образом :) - person Max Małecki; 14.12.2012

Вам не нужно определять службы для ваших типов форм более высокого уровня, если вы ссылаетесь на внутренний внедренный тип формы по его псевдониму:

Определение службы 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()
}
person dylan oliver    schedule 22.03.2013