给定 Symfony 3.0 的 "string"、"Vendor\NameBundle\Form\EntitynameType" 类型的预期参数
Expected argument of type "string", "Vendor\NameBundle\Form\EntitynameType" given Symfony 3.0
由于我在 symfony 2.7 版中遇到的问题(安装项目后立即出现 404 页面错误),我开始使用 Symfony 3.0 版。经过一些小问题后,我发现 "app/console" 被 "bin/console" 取代了。所以我现在正在开发一个新项目,并且我已经构建了一个包含 1 个名为
的实体的新包
Codeit/RestaurantBundle && CodeitRestaurantBundle:Reserveren
Format 是 annotation,实体有一个 id 和 1 个名为 "naam" 的字段(字符串,255)。我更新了模式,我生成了 Codeit 的实体,在成功完成之后,我生成了一个带有写操作的 crud。格式又是 annotation 并且 前缀是 /reserveren.
因此,如果我访问页面 web/reserveren,我将获得我的实体的显示页面。不幸的是,如果我尝试添加一个新条目,我会收到以下错误:
Expected argument of type "string", "Codeit\RestaurantBundle\Form\ReserverenType" given
我的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;
}
}
这样试试:
/.../
use Symfony\Component\Form\Extension\Core\Type\TextType;
/.../
class ReserverenType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('naam', TextType::class);
}
}
将此添加到您的实体的 class 用适合您的属性替换名称。
public function __toString() {
return $this->name;
}
试试:
$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:
Type names were deprecated and will be removed in Symfony 3.0. Instead
of referencing types by name, you should reference them by their
fully-qualified class name (FQCN) instead. With PHP 5.5 or later, you
can use the "class" constant for that:
希望对您有所帮助
表单在 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
由于我在 symfony 2.7 版中遇到的问题(安装项目后立即出现 404 页面错误),我开始使用 Symfony 3.0 版。经过一些小问题后,我发现 "app/console" 被 "bin/console" 取代了。所以我现在正在开发一个新项目,并且我已经构建了一个包含 1 个名为
的实体的新包Codeit/RestaurantBundle && CodeitRestaurantBundle:Reserveren
Format 是 annotation,实体有一个 id 和 1 个名为 "naam" 的字段(字符串,255)。我更新了模式,我生成了 Codeit 的实体,在成功完成之后,我生成了一个带有写操作的 crud。格式又是 annotation 并且 前缀是 /reserveren.
因此,如果我访问页面 web/reserveren,我将获得我的实体的显示页面。不幸的是,如果我尝试添加一个新条目,我会收到以下错误:
Expected argument of type "string", "Codeit\RestaurantBundle\Form\ReserverenType" given
我的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;
}
}
这样试试:
/.../
use Symfony\Component\Form\Extension\Core\Type\TextType;
/.../
class ReserverenType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('naam', TextType::class);
}
}
将此添加到您的实体的 class 用适合您的属性替换名称。
public function __toString() {
return $this->name;
}
试试:
$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:
Type names were deprecated and will be removed in Symfony 3.0. Instead of referencing types by name, you should reference them by their fully-qualified class name (FQCN) instead. With PHP 5.5 or later, you can use the "class" constant for that:
希望对您有所帮助
表单在 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