我从symfony 2开始,我希望显示一个“选择”类型,其中包含来自数据库的数据,但我有一个问题:
addAction:
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';
}
}
?>
错误:
Catchable Fatal Error: Argument 1 passed to AnnoncesBundle\Form\Type\AddFormType::__construct() must be an instance of AnnoncesBundle\Form\Type\CategoriesAnnonce, instance of AnnoncesBundle\Entity\CategoriesAnnonce given, called in /Users/jordan/Desktop/www/Lesbonnesaffaires/src/AnnoncesBundle/Controller/DefaultController.php on line 69 and defined
答案 0 :(得分:2)
它使用文件中定义的命名空间而不是CategoriesAnnonce
所属的适当命名空间。添加use
声明:
use AnnoncesBundle\Entity\CategoriesAnnonce
或者将您的类型提示更改为FQCN,如:
public function __construct(\AnnoncesBundle\Entity\CategoriesAnnonce, $categories) {
//...
}
感谢&#39;但我现在还有另一个问题:
表单的视图数据应该是AnnoncesBundle \ Form \ Model \ Add类的实例,但是是AnnoncesBundle \ Entity \ CategoriesAnnonce类的实例。您可以通过设置&#34; data_class&#34;来避免此错误。 null的选项或添加视图转换器,将类AnnoncesBundle \ Entity \ CategoriesAnnonce的实例转换为AnnoncesBundle \ Form \ Model \ Add的实例。
这是因为您将data_class设置为AnnoncesBundle\Form\Model\Add
:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AnnoncesBundle\Form\Model\Add',
));
}
但是你试图传递它AnnoncesBundle\Entity\CategoriesAnnonce
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\CategoriesAnnonce
以及它们如何相关或应该如何互动。但我怀疑你对创建form class和创建自定义field type以及如何创建类层次结构以及不同组件应该做什么感到困惑。我会审核forms chapter of the book和custom field type cookbook entry。然后,如果您遇到问题,请使用您的实体/模型,表单和FieldType类中的相关代码创建有关细节的新问题。