Как исправить ошибку «Объект класса не может быть преобразован в строку» при создании формы в Symfony? - PullRequest
0 голосов
/ 07 мая 2019

Я делаю очень простую форму с помощью Symfony, чтобы добавить цвет в базу данных. Он отлично работает при использовании createFormBuilder в моем контроллере, но выдает ошибку при использовании createForm с Type, который я сделал. Это ошибка, которую я получаю: Возникла исключительная ситуация во время рендеринга шаблона («Catchable Fatal Error: объект класса App \ Entity \ Color не может быть преобразован в строку») .

Я следовал Symfony doc построчно, я также пробовал некоторые решения, приведенные здесь, для других, у которых была такая же проблема (например, добавление метода __toString в мою сущность), но ничего работы.


Entity

/**
 * @ORM\Entity(repositoryClass="App\Repository\ColorRepository")
 */
class Color
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=190, unique=true)
     */
    private $name;

    /**
     * @ORM\Column(type="string", length=190, unique=true)
     */
    private $code;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function setCode(string $code): self
    {
        $this->code = $code;

        return $this;
    }
}


Контроллер

public function new(Request $request)
    {
        $color = new Color();

        $form = $this->createForm(ColorType::class, $color);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
             $color = $form->getData();

             $entityManager = $this->getDoctrine()->getManager();
             $entityManager->persist($color);
             $entityManager->flush();

            return $this->redirectToRoute('colorNew');
        }

        return $this->render('color/new.html.twig', [
            'form' => $form->createView(),
        ]);
    }


Форма

class ColorType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [
                'label' => 'couleur',
            ])
            ->add('code', TextType::class, [
                'label' => 'code couleur',
            ])
            ->add('save', SubmitType::class, ['label' => 'ajouter la couleur'])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Color::class,
        ]);
    }
}


Template

{% extends 'layout/base.html.twig' %}

{% block title %}
    Ajouter une couleur
{% endblock %}

{% block content %}
    {{ form(form) }}
{% endblock %}

Я ожидаю, что он отобразит два текстовых ввода с соответствующей меткой и кнопкой отправки, вместо этого он выдаст ошибку, о которой я упоминал. В какой-то момент я заставил его работать, комментируя $color = new Color(); в моем контроллере и, таким образом, не передавая $color в качестве аргумента методу createForm, он рендерил не только два текстовых ввода и кнопку отправки, но и цветной ввод в начале формы ... (который я не просил).

Заранее спасибо за помощь!

1 Ответ

1 голос
/ 08 мая 2019

Так что на самом деле это было немного интересно.

Symfony уже имеет ColorType.Вы не ожидаете, что создание собственного ColorType будет иметь значение, поскольку следует использовать полное имя класса, если кто-то действительно хочет знать, используется ли ColorType.Но нет, для шаблонов форм по умолчанию используется только строка ColorType.Никогда с этим не сталкивался.

Решение простое.Переименуйте ColorType во что-то вроде MyColorType, и все должно быть хорошо.

И это могло бы помочь, если бы в ваш вопрос была включена первая строка трассировки исключений:

An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class App\Entity\Color could not be converted to string").
in vendor/symfony/twig-bridge/Resources/views/Form/form_div_layout.html.twig (line 17)

Возможно, нет, ноэто то, что привело меня к проблеме, когда я воспроизвел контрольный пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...