symfony对象无法转换为字符串

时间:2017-04-13 15:03:12

标签: symfony

我是symfony的新手,我正在尝试实现数据转换器。我按照文档查看了这里发布的不同解决方案。但我没有发现我的代码有什么问题。

我收到了这个错误:

捕获致命错误:类AppBundle \ Entity \ Todo的对象无法转换为字符串

如果有人知道该解决方案的其他帖子,请告诉我在哪里可以找到它。

提前谢谢。

所以,这些是我的实体。 Todo课程

    <?php

    namespace AppBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;

    /**
     * Todo
     *
     * @ORM\Table(name="todo")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\TodoRepository")
     */  


class Todo
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         * @var string
         *
         * @ORM\Column(name="name", type="string", length=20)
         */
        private $name;

        /**
         * @var string
         *
         * @ORM\Column(name="category", type="string", length=20)
         */
        private $category;

        /**
         * @var string
         *
         * @ORM\Column(name="description", type="string", length=10)
         */
        private $description;

        /**
         * @var string
         *
         * @ORM\Column(name="priority", type="string", length=10)
         */
        private $priority;

        /**
         *
         * @ORM\ManyToOne(
         *     targetEntity="AppBundle\Entity\User",
         *     inversedBy="todos"
         * )
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
         */
        private $creatorId;

    //... getters and setters

用户类:

<?php
// src/AppBundle/Entity/User.php

namespace AppBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }

    /**
     * @ORM\OneToMany(
     *     targetEntity="AppBundle\Entity\Todo",
     *     mappedBy="creatorId"
     * )
     */
    private $todos;

}

在User类中,我没有getter / setters

我的TodoType

class TodoType extends AbstractType{

    private $manager;

    public function __construct(ObjectManager $manager)
    {
    $this->manager = $manager;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder

            ->add('name', TextType::class, array(
                'label' => 'Name',
                'required' => true
              )
            )

            ->add('category', TextType::class, array(
                'label' => 'Category'
              )
            )

            ->add('priority', EntityType::class, array(
                'class' => 'AppBundle:Todo',
                'choice_label' => 'priority',
              )
            )

            ->add('creatorId', TextType::class, array(
              'label' => 'creator Id:',
            ));

            $builder->get('creatorId')
                ->addModelTransformer(new IssueToNumberTransformer($this->manager));

    }

    public function getName()
    {
        return 'todo';
    }

}

变压器

<?php
namespace FOS\UserBundle\Form\DataTransformer;

use AppBundle\Entity\User;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class IssueToNumberTransformer implements DataTransformerInterface
{
    private $manager;

    public function __construct(ObjectManager $manager)
    {
        $this->manager = $manager;
    }

    /**
     * Transforms an object (creatorId) to a string (number).
     *
     * @param  creatorId|null $creatorId
     * @return string
     */
    public function transform($creatorId)
    {
        if (null === $creatorId) {
            return '';
        }

        return $creatorId->getId();

    }

    /**
     * Transforms a string (number) to an object (creatorId).
     *
     * @param  string $creatorId
     * @return creatorId|null
     * @throws TransformationFailedException if object (creatorId) is not found.
     */
    public function reverseTransform($creatorId)
    {
        // no issue number? It's optional, so that's ok
        if (!$creatorId) {
            return;
        }

        $creatorId = $this->manager
            ->getRepository('AppBundle:User')
            // query for the issue with this id
            ->find($creatorId);


        if (null === $creatorId) {
            throw new TransformationFailedException(sprintf(
                'A user with number "%s" does not exist!',
                $creatorId
            ));
        }

        return $creatorId;
    }
}

控制器(功能)

  public function createAction(Request $request){

        $em = $this->getDoctrine()->getManager();

        // 1) build the form
        $todo = new Todo();

        $form = $this->createForm(new TodoType($em), $todo);

        // 2) handle the submit (will only happen on POST)
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

          // 3) save the Todo!
          $em->persist($todo);
          $em->flush();

        return $this->redirectToRoute('todo_create');

      }

        return $this->render('todo/create.html.twig', array(
            'todo'=>$todo,
            'form'=>$form->createView()
        ));

    }

1 个答案:

答案 0 :(得分:1)

在这一部分:

return $this->render('todo/create.html.twig', array(
      'todo'=>$todo,
      'form'=>$form->createView()
));

因为您尝试将$todo对象传递给Twig模板。你不能这样做。你需要什么?如果您只需要Todo名称并且已经创建了getter / setter,那么您可以这样做:

return $this->render('todo/create.html.twig', array(
      'todo_name' => $todo->getName(),
      'form' => $form->createView()
));

希望这是有道理的。

根据评论编辑#2。

您的控制器中此行也是错误的:

$form = $this->createForm(new TodoType($em), $todo);

应该是这样的:

$form = $this->createForm(TodoType::class, $todo);