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'));