使用项目实体填充选择表单元素的最佳方法是使用entity form field。所以你不必传递任何选项来形成类型类。
$builder
->add('project', 'entity', [
'label' => 'form.project',
'class' => 'AppBundle\Entity\Project',
'property' => 'name',
'required' => true,
'empty_value' => 'form.select_empty_value',
'query_builder' => function($repository) {
return $repository->createQueryBuilder('p')->add('orderBy', 'p.name ASC');
},
])
;
如果您需要填充 choice field,还有另一个最佳实践。您应该将表单类型类定义为服务并将 Entity Manager 注入其中。因此,您可以从数据库中获取任何数据并填充任何选择字段。
services.xml
<service id="app.form.modifier_supprimer_projet" class="AdminBundle\Form\ModifierSupprimerProjet">
<tag name="form.type" alias="app_modifier_supprimer_projet" />
<argument type="service" id="doctrine.orm.entity_manager"/>
</service>
修饰符SupprimerProjet.php
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityManager;
class ModifierSupprimerProjet extends AbstractType
{
/**
* @var EntityManager
*/
protected $em;
/**
* @param EntityManager $em
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('project', 'choice', [
'label' => 'form.project',
'choices' => $this->em->getRepository('AppBundle:Project')->getProjectsList(),
])
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\ModifierSupprimerProjet',
]);
}
/**
* @return string
*/
public function getName()
{
return 'app_modifier_supprimer_projet';
}
}
控制器
$modifierSupprimerProjet = new ModifierSupprimerProjet();
$form = $this->createForm('app_modifier_supprimer_projet', $modifierSupprimerProjet);
createForm 方法的第二个参数是实体,如果您的表单映射到任何实体。