2016-12-01 2 views
0

У меня есть следующий вид:Передача аргументов в Symfony 3 Форма configureOptions

class TestFormType extends AbstractType 
{ 
    protected $testArgument; 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     if (isset($options['testArgument'])) { 
      $this->testArgument = $options['testArgument']; 
     } 

     $builder->add('textField', 'Symfony\Component\Form\Extension\Core\Type\TextType'); 
    } 

    public function configureOptions(OptionsResolver $optionsResolver) 
    { 
     $optionsResolver->setRequired('testArgument'); 

     $optionsResolver->setDefaults(
      array(
       'data_class' => get_class($this->testArgument) 
      ) 
     ); 
    } 
} 

Я передаю значение атрибута testArgument через параметры формы (Symfony 3 модификации), но когда приходит, чтобы получить имя класса атрибута для установки 'data_class' внутри метода configureOptions, он всегда null. В основном мне нужно зависеть от атрибута класса типа формы внутри метода configureOptions. Может кто-то, пожалуйста, помогите мне здесь в правильном направлении?

+0

Согласно php doc 'get_class' Возвращает имя класса, для которого' object' является экземпляром. Возвращает 'FALSE', если объект не является объектом. Если объект отсутствует в классе, возвращается имя этого класса. возможно, 'get_class' возвращает false, потому что вы не передали ему объект. –

+0

Довольно точно configureOptions вызывается перед buildForm. Можете добавить некоторые утверждения для подтверждения. Что еще более важно, система форм создает только один объект определенного типа. Поэтому, если вы планируете иметь два разных экземпляра этого типа, каждый с другим классом данных, тогда он не будет работать вообще. – Cerad

+0

@MohammadZareMoghadam: он всегда возвращает '' TestFormType'', поскольку 'configureOptions' работает до' buildForm' –

ответ

0

мне пришлось пройти зависимость в configureOptions метода от самого метода формы завод create:

$form = $this->factory->create(
      'app\TestBundle\Form\Type\TestFormType', 
      $this->testArgument, 
      array(
       'data_class' => get_class($this->testArgument) 
      ) 
     ); 

, поскольку он не будет установлен настройками по умолчанию в типе формы и должен был реорганизовать класс формы типа следующим образом:

class TestFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('textField', 'Symfony\Component\Form\Extension\Core\Type\TextType'); 
    } 
} 
Смежные вопросы