Ожидаемый аргумент типа "строка", "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);

http://symfony.com/doc/current/book/forms.html

Попробуйте с:

$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;
}
Другие вопросы по тегам