Как установить параметр конструктора Entity из типа формы?

Мне нужно передать параметр конструктору объекта, который используется в типе формы.

Я устанавливаю объект из типа формы в методе setDefaultOptions:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyApp\MyBundle\Entity\MyEntity'
    ));
}

Я хотел бы использовать что-то вроде этого:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyApp\MyBundle\Entity\MyEntity',
        'my_parameter' => 'some value'
    ));
}

чтобы он был введен через конструктор.

Это возможно? (Я использую Symfony 2.2)


person David Morales    schedule 09.05.2013    source источник
comment
Зачем вам значение? Для извлечения набора (или одного точного) объекта?   -  person DonCallisto    schedule 09.05.2013
comment
Я просто хочу передать параметр объекту.   -  person David Morales    schedule 09.05.2013


Ответы (2)


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

Установка опции data_class даже не требуется для соединения формы с объектным объектом. В большинстве случаев класс данных угадывается на основе объекта, переданного в конструктор форм.

Из документов Symfony:

Каждая форма должна знать имя класса, содержащего базовые данные (например, Acme\TaskBundle\Entity\Task). Обычно это просто угадывается на основе объекта, переданного второму аргументу для createForm (т.е. $task). Позже, когда вы начнете встраивать формы, этого уже будет недостаточно. Таким образом, хотя это и не всегда необходимо, обычно рекомендуется явно указывать параметр data_class (...)

изменить:

Пример:

class SomeController extends Controller
{
    public function fooAction()
    {
         $entityObject = new MyEntity($someArgument);

         // now we create form:
         $form = $this->createForm(new BarFormType(), $entityObject);

         // then you can bind form:
         $form->bind($this->getRequest());

         // ... and enjoy your data :)
         printf("Hello %s", $entityObject->getValuePassedByUserViaForm());
    }
}
person Cyprian    schedule 09.05.2013
comment
Итак, в случае страницы, которая показывает форму, как я могу передать параметр объекту? - person David Morales; 09.05.2013
comment
Я не уверен, что понял тебя. Позвольте мне уточнить: вы связываете объект сущности с формой, передавая объект сущности в качестве второго аргумента методу createForm (фабрика форм). Это означает, что вам нужно создать объект сущности раньше. Затем, когда вы отправляете форму и связываете запрос, объект сущности заполняется данными, переданными через форму. Я расширил свой ответ примером - person Cyprian; 10.05.2013
comment
Верный. В тот момент я смотрел на это не с той стороны. - person David Morales; 26.07.2013
comment
Форма никогда не создает объект-сущность — это утверждение не совсем верно. Если к форме присоединены требуемые подчиненные формы, она обязательно создаст экземпляр класса для этой подчиненной формы и сделает это, передав конструктору нулевые аргументы: см. FormType::configureOptions, где вызывается new $class(). Таким образом, ответ Максима ниже в некоторых случаях более полезен. - person Daniel L; 31.01.2019

Я думаю, вы ищете этот http://symfony.com/doc/master/cookbook/form/use_empty_data.html#option-2-provide-a-closure

Допустим, у вас есть объект данных Money, который принимает два аргумента: сумму и валюту. Вот тип формы для такого объекта:

<?php
class MoneyType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('amount', 'number')
            ->add('currency', 'text')
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Foo\Model\Money',
            'empty_data' => function (FormInterface $form) {
                return new Money(
                    $form->getData()['amount'],
                    $form->getData()['currency']
                );
            },
        ));
    }
}
person Maksim Kotlyar    schedule 24.07.2013
comment
Согласен, но если setCurrency нет, выбрасывается Exception. Вы раскрыли это дело? - person mmoreram; 14.07.2014
comment
У вас только одна валюта? Не хотите показывать это на форме? Если это так, я считаю, что можно передать параметры для закрытия empty_data в качестве второго аргумента. Таким образом, вы можете удалить валюту поля формы и взять ее из опций. - person Maksim Kotlyar; 15.07.2014
comment
Для меня сработало $form->get('amount')->getData() и т. д. - person Jimbo; 17.02.2015
comment
Любые идеи, как передать значение родительской формы в clojure? $form->getParent()->getData(); кажется, еще не установлено во время выполнения. - person Aistis; 29.03.2016
comment
@mmoreram Чтобы устранить исключение, возникшее там, где нет сеттеров, см. Полный ответ (и полный пример) здесь webmozart.io/blog/2015/09/09/value-objects-in-symfony-forms/ - person Grease; 11.11.2018