Как получить экземпляр хранилища сущностей в классе Form (Type) в Symfony 2? - PullRequest
7 голосов
/ 07 февраля 2012

Допустим, у меня есть обычный *Type класс:

class LocationType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add(...)
            ...
    }
}

и одно из полей имеет тип choice. Предполагается, что значения, которые необходимо использовать в качестве элементов выбора, должны быть получены из базы данных (из некоторого конкретного хранилища сущностей).

Итак, вопрос: как получить репозиторий в классе LocationType? Является ли передача его через конструктор единственным способом получить его?

UPD

Я знаю о типе entity, но, к сожалению, я не могу его использовать, потому что мое свойство не является и не может быть определено как отношение one-to-one из-за очень сложных условий отношений, которые Doctrine не поддерживает (пока?). См. Как задать несколько условий соединения для отношения 1: 1 в Doctrine 2 для получения дополнительной информации

1 Ответ

12 голосов
/ 07 февраля 2012

Вы можете указать тип поля сущности в качестве опции, например так:

$builder
    ->add('foo', 'entity', array(
        'class'  => 'FooBarBundle:Foo',
        'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
             return $er->createQueryBuilder('q')->orderBy('q.name', 'ASC');
         },
     ));

EDIT : На самом деле опция 'class' является единственной обязательной опцией поля. Вы можете прочитать немного больше о типе поля сущности здесь: http://symfony.com/doc/2.0/reference/forms/types/entity.html

Надеюсь, это поможет.

EDIT

В дополнение к обсуждению ниже, вот пример

В контроллере:

$entity = new Foo();
$type   = new FooType();

$er = $this->getDoctrine()
    ->getEntityManager()
    ->getRepository('FooBarBundle:Foo');

$form = $this->createForm($type, $entity, array(
    'foo_repository' => $er
));

Массив $options передается методу FooType::buildForm(), поэтому в этом методе должен быть доступен foo_repository следующим образом:

$er = $options['foo_repository'];
...