Я пытаюсь внедрить формы в symfony, но я не уверен, что я делаю неправильно. У меня два объекта. Пользователь и цвет
User.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* User
*
* @ORM\Table()
* @ORM\Entity
*/
class User
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="Color", cascade={"persist"})
*/
protected $color;
public function getId()
{
return $this->id;
}
public function getColor()
{
return $this->color;
}
public function setColor($color)
{
$this->color = $color;
}
}
color.php
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Color
*
* @ORM\Table()
* @ORM\Entity
*/
class Color
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
public function getId()
{
return $this->id;
}
public function setName($name)
{
$this->name = $name;
return $this;
}
public function getName()
{
return $this->name;
}
}
Форма визуализируется отлично, но когда я пытаюсь сохранить объект, я получаю сообщение об ошибке Catchable Fatal Error: Object of class AppBundle\Entity\Color could not be converted to string
Здесь мой контроллер
.......
$user = new User();
$form = $this->createForm(new SelectionType(), $user);
$form->handleRequest($request);
if($form->isValid()){
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return new Response(sprintf('ID %s', $user->getId()));
}
SelectionType.php
........
->add('color', new ColorType())
....
Так что я делаю неправильно?
Добавьте __toString()
в свой класс Color
// all declaration here
class Color
{
// all properties here
public function __toString()
{
return $this->name();
}
// all getters and setters here
}
Эта ошибка вызвана тем, что Symfony Form пытается предоставить "представление для GUI" вашего объекта и, если вы не укажете ничего в FormBuilder (или если вы не используете какой-либо DataTransformer), он будет искать строковое представление объекта (который вы можете получить с помощью метода __toString()
)