【问题标题】:Expected argument of type "string", "Vendor\NameBundle\Form\EntitynameType" given Symfony 3.0给定 Symfony 3.0 的“string”、“Vendor\NameBundle\Form\EntitynameType”类型的预期参数
【发布时间】:2015-12-09 14:07:26
【问题描述】:

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

Codeit/RestaurantBundle && CodeitRestaurantBundle:Reserveren

格式注解,实体有一个id和1个字段,叫做"naam" (string, 255)。我更新了模式,生成了 Codeit 的实体,在成功完成之后,我生成了一个带有写入操作的 crud。格式还是 annotation 并且 前缀是 /reserveren

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

给定类型“字符串”、“Codeit\RestaurantBundle\Form\ReserverenType”的预期参数

我的 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;
    }


}

【问题讨论】:

    标签: php formbuilder symfony


    【解决方案1】:

    表单在 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

    【讨论】:

    • 感谢塞拉德!效果很好。我会重新考虑用更知名的版本制作一个新项目。无论如何,谢谢!
    • 在新项目中使用 3.x 没有错。请注意,相当多的 S2 信息不再适用。
    • 非常感谢,我正在为表格为什么不起作用而发疯,现在我知道了。
    【解决方案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 或更高版本,您 可以为此使用“类”常量:

    希望有帮助

    【讨论】:

    • 我现在通过@cerad 响应了解到我发布的字段是字段类型猜测(不需要指定类型),但您需要的主要表单声明(类)类型跨度>
    【解决方案3】:

    试试这样:

    /.../
    
    use Symfony\Component\Form\Extension\Core\Type\TextType; 
    
    /.../
    
    class ReserverenType extends AbstractType
    {
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
               $builder->add('naam', TextType::class);
        }
    }
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 所以,在我的 Bundle/Entity/Reserveren.php 中,我必须在类的底部添加代码,并且我必须在 return $this-&gt;naam 中替换 return $this-&gt;name;?因为不幸的是这不起作用.. :(
      • 是的,它现在在我上面的问题中!
      • 哦,那是另一个故事。你试过 ->add('naam','text')
      猜你喜欢
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 2016-01-14
      相关资源
      最近更新 更多