Let's say I have ordinary *Type class:
class LocationType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add(...)
            ...
    }
}
and one of the fields is a choice type. The values that need to be used as choice items are supposed to be retrieved from the database (from some particular entity repository).
So the question is: how to get the repository in the LocationType class? Is passing it through the constructor the only way to get it?
UPD:
I know about entity type but unfortunately I cannot use it, because my property is not and cannot be defined as one-to-one relation due to very complex relation conditions that Doctrine doesn't support (yet?). See How to specify several join conditions for 1:1 relationship in Doctrine 2 for additional details
You can specify an entity field type as an option like so:
$builder
    ->add('foo', 'entity', array(
        'class'  => 'FooBarBundle:Foo',
        'query_builder' => function(\Doctrine\ORM\EntityRepository $er) {
             return $er->createQueryBuilder('q')->orderBy('q.name', 'ASC');
         },
     ));
EDIT: Actually the 'class' option is the only required field option. You can read a bit more about the entity field type here: http://symfony.com/doc/2.0/reference/forms/types/entity.html
Hope this helps.
EDIT:
Further to discussion below, here's an example
In the controller:
$entity = new Foo();
$type   = new FooType();
$er = $this->getDoctrine()
    ->getEntityManager()
    ->getRepository('FooBarBundle:Foo');
$form = $this->createForm($type, $entity, array(
    'foo_repository' => $er
));
The $options array is passed to the FooType::buildForm() method, so foo_repository should then be available in this method like so:
$er = $options['foo_repository'];
Symfony 4 and 5:
Symfony Form Types are services so you can use dependency injection:
class FooType extends AbstractType
{
    private $entityManager;
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }
    private function getFooRepository(): FooRepository
    {
        return $this->entityManager->getRepository(Foo::class);
    }
    ...
}
or inject specific repository:
class FooType extends AbstractType
{
    private $fooRepository;
    public function __construct(FooRepository $fooRepository)
    {
        $this->fooRepository = $fooRepository;
    }
    ...
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With