在Symfony 3.0中给出“string”,“Vendor \ NameBundle \ Form \ EntitynameType”类型的预期参数

时间:2015-12-09 14:07:27

标签: php formbuilder symfony

由于我使用symfony版本2.7时遇到的问题(安装项目后立即出现404页错误)我开始使用Symfony 3.0版。在一些小问题之后,我发现“app / console”被“bin / console”取代。所以我现在正在开发一个新项目,我已经用一个名为

的实体构建了一个新的bundle
  

Codeit / RestaurantBundle&& CodeitRestaurantBundle:Reserveren

格式注释,实体有一个id和1个字段,名为“naam”(字符串,255)。我更新了模式,我生成了Codeit的实体,在成功完成之后,我生成了一个带有写操作的crud。格式再次为注释前缀为/ reserveren

因此,如果我访问网页web / reserveren,我将获得我的实体的显示页面。不幸的是,如果我尝试添加新条目,我会收到以下错误:

  

“string”,“Codeit \ RestaurantBundle \ Form \ ReserverenType”类型的预期参数

My Bundle / Form / ReserverenType.php

<?php

namespace Codeit\RestaurantBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ReserverenType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('naam')
    ;
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Codeit\RestaurantBundle\Entity\Reserveren'
    ));
}
}

我的实体代码

<?php

namespace Codeit\RestaurantBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Reserveren
 *
 * @ORM\Table(name="reserveren")
 * @ORM\Entity(repositoryClass="Codeit\RestaurantBundle\Repository\ReserverenRepository")
 */
class Reserveren
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="Naam", type="string", length=255)
     */
    private $naam;


    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set naam
     *
     * @param string $naam
     *
     * @return Reserveren
     */
    public function setNaam($naam)
    {
        $this->naam = $naam;

        return $this;
    }

    /**
     * Get naam
     *
     * @return string
     */
    public function getNaam()
    {
        return $this->naam;
    }


}

4 个答案:

答案 0 :(得分:27)

表格在3.0中发生了很大变化。你现在可能最好坚持使用2.8。

您没有显示它,但我怀疑,根据错误消息,您的控制器代码如下所示:

$form = $this->createForm(new ReservernType(), $item);

这是2.x的做事方式。对于3.x使用:

$form = $this->createForm(ReservernType::class, $item);

http://symfony.com/doc/current/book/forms.html#creating-form-classes

答案 1 :(得分:2)

尝试:

$builder
        ->add('naam', TextType::class);
        // If you use PHP 5.3 or 5.4 you must use
        // ->add('naam','Symfony\Component\Form\Extension\Core\Type\TextType')

而不是

$builder
    ->add('naam');

并添加use声明:

use Symfony\Component\Form\Extension\Core\Type\TextType;

动机:来自upgrade guide

  

不推荐使用类型名称,将在Symfony 3.0中删除。代替   按名称引用类型,您应该通过它们引用它们   完全限定的类名(FQCN)。使用PHP 5.5或更高版本,您   可以使用“class”常量:

希望这个帮助

答案 2 :(得分:1)

试试这样:

/.../

use Symfony\Component\Form\Extension\Core\Type\TextType; 

/.../

class ReserverenType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
           $builder->add('naam', TextType::class);
    }
}

答案 3 :(得分:-1)

将此项添加到您实体的类替换名称中,并使用适合您的属性。

public function __toString() {
    return $this->name;
}