Php 来自数据库SYMFONY 2的选择表格

Php 来自数据库SYMFONY 2的选择表格,php,symfony,choice,Php,Symfony,Choice,我从symfony 2开始,我想用数据库中的数据显示一个“choice”类型,但我有一个问题: 添加操作: public function addAction() { $categories = new CategoriesAnnonce(); $form = $this->get('form.factory')->create(new AddFormType($categories),$categories); return $this->re

我从symfony 2开始,我想用数据库中的数据显示一个“choice”类型,但我有一个问题:

添加操作:

    public function addAction()
{
    $categories = new CategoriesAnnonce();
    $form = $this->get('form.factory')->create(new AddFormType($categories),$categories);
    return $this->render('AnnoncesBundle::add.html.twig', array(
        'form' => $form->createView(),
    ));
}
AddFormType.php:

    <?php

namespace AnnoncesBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints as Assert;

class AddFormType extends AbstractType
{
    private $cat;

    public function __construct(CategoriesAnnonce $categories)
    {
        $this->cat = $categories->getNomSousCategorie();
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('titre', 'text')
            ->add('categories', 'choice', array(
            'choices' => $this->cat,
        ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AnnoncesBundle\Form\Model\Add',
        ));
    }

    public function getName()
    {
        return 'Add';
    }
}

?>

它使用文件中定义的名称空间,而不是
categoriesannone
所属的正确名称空间。添加
use
语句:

使用AnnoncesBundle\Entity\categoriesannone

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('titre', 'text')
        // this cat is an instance of AnnoncesBundle\Entity\CategoriesAnnonce
        ->add('categories', 'choice', array(
        'choices' => $this->cat,
    ));
}
或者将您的类型提示更改为FQCN,如:

public function __construct(\AnnoncesBundle\Entity\CategoriesAnnonce, $categories) {
  //...
}

谢谢,但我现在还有一个问题:

表单的视图数据应为类AnnoncesBundle\form\Model\Add的实例,但为类AnnoncesBundle\Entity\categoriesannone的实例。您可以通过将“data_class”选项设置为null或添加视图转换器来避免此错误,该转换器将类AnnoncesBundle\Entity\Categories的实例一次性转换为AnnoncesBundle\Form\Model\Add的实例

之所以会发生这种情况,是因为您将数据类设置为
AnnoncesBundle\Form\Model\Add

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AnnoncesBundle\Form\Model\Add',
    ));
}
但是您正在尝试一次性传递它
AnnoncesBundle\Entity\categoriesannone

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('titre', 'text')
        // this cat is an instance of AnnoncesBundle\Entity\CategoriesAnnonce
        ->add('categories', 'choice', array(
        'choices' => $this->cat,
    ));
}

我认为您需要为所有这些重新编写代码。不幸的是,我无法给出具体信息,因为我不知道什么是
AnnoncesBundle\Form\Model\Add
AnnoncesBundle\Entity\categoriesannone
,以及它们之间的关系或应该如何交互。但我怀疑您对创建和创建自定义以及如何创建类层次结构以及不同组件应该做什么感到困惑。我会回顾一下和。然后,如果您有问题,请使用实体/模型、表单和字段类型类中的相关代码创建一个关于细节的新问题。

Thank's,但我现在有一个问题:表单的视图数据应该是类AnnoncesBundle\Form\Model\Add的实例,但它是类AnnoncesBundle\Entity\categories的实例。您可以通过将“data_class”选项设置为null或添加一个视图转换器来避免此错误,该转换器可将类AnnoncesBundle\Entity\Categories的实例一次性转换为AnnoncesBundle\Form\Model\Add的实例。@JordanLechevin稍微更新了我的答案,但我不确定它对您有多大帮助。我认为您的问题实际上不是关于您所遇到的具体错误,而是关于表单组件如何工作以及如何与sf2中的原则交互的困惑。