Ожидаемый аргумент типа "строка", "Vendor\NameBundle\Form\EntitynameType", заданный Symfony 3.0
Из-за проблем с Symfony версии 2.7 (ошибка 404 страниц сразу после установки проекта) я начал использовать Symfony версии 3.0. После некоторых небольших проблем я понял, что "app/console" заменено на "bin/console". Итак, я сейчас работаю над новым проектом, и я уже собрал новый пакет с 1 объектом с именем
Codeit/RestaurantBundle && CodeitRestaurantBundle: Резервен
Формат представляет собой аннотацию, и у сущности есть поле id и 1, называемое "naam" (строка 255). Я обновил схемы, сгенерировал сущности Codeit, и после того, как это было успешно сделано, я сгенерировал crud с действиями записи. Формат был снова аннотацией и префиксом /Reserveren.
Поэтому, если я захожу на страницу web /Reserveren, я получаю страницу с показом моей сущности. К сожалению, если я пытаюсь добавить новую запись, я получаю следующую ошибку:
Ожидается аргумент типа "строка", "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 ответа
Формы изменились совсем немного в 3.0. Возможно, вам лучше придерживаться 2.8 на данный момент.
Вы не показывали это, но я подозреваю, что на основании сообщения об ошибке код вашего контроллера выглядит так:
$form = $this->createForm(new ReservernType(), $item);
Это 2.x способ делать вещи. Для использования 3.x:
$form = $this->createForm(ReservernType::class, $item);
Попробуйте с:
$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;
Мотивация: из руководства по обновлению:
Имена типов устарели и будут удалены в Symfony 3.0. Вместо того, чтобы ссылаться на типы по имени, вы должны вместо этого ссылаться на них по их полному имени класса (FQCN). В PHP 5.5 или новее вы можете использовать константу "class" для этого:
Надеюсь это поможет
Попробуйте вот так:
/.../
use Symfony\Component\Form\Extension\Core\Type\TextType;
/.../
class ReserverenType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('naam', TextType::class);
}
}
Добавьте это к классу, замените имя вашей сущности атрибутом, который вам подходит.
public function __toString() {
return $this->name;
}