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