Symfony 2: доступ к базе данных внутри FormBuilder

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

public function buildForm(FormBuilder $builder, array $options) {
    $builder -> add('item', 'text', array('label' => 'Item'));
    $builder -> add('category', 'choice', array(
        'choices'   => ???,
        'label' => 'Category'
    ));
}

Как я могу получить категории из базы данных здесь и использовать их для создания моей формы ? (не удается получить доступ к $this - >getDoctrine ->... внутри этого класса).

2 ответов


использовать типа entity вместо choice

$builder
  ->add('entity_property', 'entity', array(
    'class' => 'Namespace\To\Entity',
    'query_builder' => function(EntityRepository $repository) {
       return $repository->createQueryBuilder('q')
          ->where('q.a_field = yourvalue');
     }
));

Edit:

два способа использования пользовательских параметров в запросе. В обоих случаях параметры вводятся извне, поэтому ваш FormType не нуждается в каких-либо ссылках на сеанс или объекты запроса или что-либо еще.

1-передать необходимые параметры конструктору

class TaskType extends AbstractType
{
    private $custom_value;

    public function __construct($custom_value) {
        $this->custom_value = $custom_value;
    }

    // ...
}

в своем buildForm() необходимо скопировать значение в локальную переменную и сделать его доступно для обратного вызова query_builder:

public function buildForm(/*...*/) {
   $my_custom_value = $this->custom_value;

   // ...
       'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
           return $repository->createQueryBuilder('q') 
               ->where('q.a_field = :my_custom_value')
               ->setParameter('my_custom_value', $my_custom_value);
       }

   // ...
}

2 - Используйте на buildForm метод.

сначала вы должны определить значение по умолчанию, переопределяя getDefaultOptions:

public function getDefaultOptions(array $options)
{
    return array(
        'my_custom_value' => 'defaultvalue'
    );
}

затем вы можете передать его от своего контроллера в третьем аргументе createForm метод.

$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));

теперь значение должно быть доступно через $options параметр метода youru buildForm. Передайте его обратному вызову, как описано выше.


В Symfony 2.1

теперь вы должны использовать OptionsResolverInterface внутри setDefaultOptions метод. Вот код, который вам нужно будет использовать, если вы хотите получить параметры (используя тот же пример, что и принятый ответ)


use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

public function buildForm(FormBuilderInterface $builder, array $options){

    parent::buildForm($builder, $options);

   $my_custom_value = $options[custom_value];

   // ...
       'query_builder' => function(EntityRepository $repository) use ($my_custom_value) {
           return $repository->createQueryBuilder('q') 
               ->where('q.a_field = :my_custom_value')
               ->setParameter('my_custom_value', $my_custom_value);
       }

   // ...

}
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'my_custom_value' => 'defaultvalue'
        ));
    }

вы по-прежнему передаете параметры таким же образом:

$this->createForm(new YourFormType(), $entity, array('my_custom_value' => 'custom_value'));