2017-03-04 131 views
-1

我希望游戏实体与相关类型一起出现。 这对于游戏来说是多对一的关系,对于类型实体来说是一对多的关系。 所以游戏可以有1种类型,而类型可以有很多游戏。Symfony错误(“可捕获的致命错误:类Proxies__CG __ AppBundle Entity Type的对象无法转换为字符串”)

我得到的错误:

An exception has been thrown during the rendering of a template ("Catchable Fatal Error: Object of class Proxies__CG__\AppBundle\Entity\Type could not be converted to string").

当向下滚动它指向行的意见/游戏/ show.html.twig文件的14:

<tr> 
    <th>Type</th> 
    <td>{{ game.type}}</td> 
</tr> 

的问题:怎么办我在视图中显示当前游戏的类型?

这里是我的代码:

GameController.php:

<?php 

namespace AppBundle\Controller; 

use AppBundle\Entity\Game; 
use AppBundle\Entity\Type; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Component\HttpFoundation\Request; 

/** 
* Game controller. 
* 
* @Route("game") 
*/ 
class GameController extends Controller 
{ 
    /** 
    * Lists all game entities. 
    * 
    * @Route("/", name="game_index") 
    * @Method("GET") 
    */ 
    public function indexAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $games = $em->getRepository('AppBundle:Game')->findAll(); 

     return $this->render('game/index.html.twig', array(
      'games' => $games, 
     )); 
    } 

    /** 
    * Creates a new game entity. 
    * 
    * @Route("/new", name="game_new") 
    * @Method({"GET", "POST"}) 
    */ 
    public function newAction(Request $request) 
    { 

     $game = new Game(); 

     $form = $this->createForm('AppBundle\Form\GameType', $game); 
     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($game); 
      $em->flush($game); 

      return $this->redirectToRoute('game_show', array('id' => $game->getId())); 
     } 

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

    /** 
    * Finds and displays a game entity. 
    * 
    * @Route("/{id}", name="game_show") 
    * @Method("GET") 
    * @inheritdoc 
    * 
    */ 
    public function showAction(Game $game, Type $type) 
    { 
     $deleteForm = $this->createDeleteForm($game); 


     return $this->render('game/show.html.twig', array(
      'game' => $game, 
      'type' => $game->getType(), 
      'delete_form' => $deleteForm->createView(), 
     )); 
    } 

    /** 
    * Displays a form to edit an existing game entity. 
    * 
    * @Route("/{id}/edit", name="game_edit") 
    * @Method({"GET", "POST"}) 
    */ 
    public function editAction(Request $request, Game $game) 
    { 
     $deleteForm = $this->createDeleteForm($game); 
     $editForm = $this->createForm('AppBundle\Form\GameType', $game); 
     $editForm->handleRequest($request); 

     if ($editForm->isSubmitted() && $editForm->isValid()) { 
      $this->getDoctrine()->getManager()->flush(); 

      return $this->redirectToRoute('game_show', array('id' => $game->getId())); 
     } 

     return $this->render('game/edit.html.twig', array(
      'game' => $game, 
      'edit_form' => $editForm->createView(), 
      'delete_form' => $deleteForm->createView(), 

     )); 
    } 

    /** 
    * Deletes a game entity. 
    * 
    * @Route("/{id}", name="game_delete") 
    * @Method("DELETE") 
    */ 
    public function deleteAction(Request $request, Game $game) 
    { 
     $form = $this->createDeleteForm($game); 
     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->remove($game); 
      $em->flush($game); 
     } 

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

    /** 
    * Creates a form to delete a game entity. 
    * 
    * @param Game $game The game entity 
    * 
    * @return \Symfony\Component\Form\Form The form 
    */ 
    private function createDeleteForm(Game $game) 
    { 
     return $this->createFormBuilder() 
      ->setAction($this->generateUrl('game_delete', array('id' => $game->getId()))) 
      ->setMethod('DELETE') 
      ->getForm() 
     ; 
    } 
} 

TypeController.php

<?php 

namespace AppBundle\Controller; 

use AppBundle\Entity\Type; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Symfony\Component\HttpFoundation\Request; 

/** 
* Type controller. 
* 
* @Route("type") 
*/ 
class TypeController extends Controller 
{ 
    /** 
    * Lists all type entities. 
    * 
    * @Route("/", name="type_index") 
    * @Method("GET") 
    */ 
    public function indexAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $types = $em->getRepository('AppBundle:Type')->findAll(); 

     return $this->render('type/index.html.twig', array(
      'types' => $types, 
     )); 
    } 

    /** 
    * Creates a new type entity. 
    * 
    * @Route("/new", name="type_new") 
    * @Method({"GET", "POST"}) 
    */ 
    public function newAction(Request $request) 
    { 
     $type = new Type(); 
     $form = $this->createForm('AppBundle\Form\TypeType', $type); 
     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($type); 
      $em->flush($type); 

      return $this->redirectToRoute('type_show', array('id' => $type->getId())); 
     } 

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

    /** 
    * Finds and displays a type entity. 
    * 
    * @Route("/{id}", name="type_show") 
    * @Method("GET") 
    */ 
    public function showAction(Type $type) 
    { 
     $deleteForm = $this->createDeleteForm($type); 

     return $this->render('type/show.html.twig', array(
      'type' => $type, 
      'delete_form' => $deleteForm->createView(), 
     )); 
    } 

    /** 
    * Displays a form to edit an existing type entity. 
    * 
    * @Route("/{id}/edit", name="type_edit") 
    * @Method({"GET", "POST"}) 
    */ 
    public function editAction(Request $request, Type $type) 
    { 
     $deleteForm = $this->createDeleteForm($type); 
     $editForm = $this->createForm('AppBundle\Form\TypeType', $type); 
     $editForm->handleRequest($request); 

     if ($editForm->isSubmitted() && $editForm->isValid()) { 
      $this->getDoctrine()->getManager()->flush(); 

      return $this->redirectToRoute('type_edit', array('id' => $type->getId())); 
     } 

     return $this->render('type/edit.html.twig', array(
      'type' => $type, 
      'edit_form' => $editForm->createView(), 
      'delete_form' => $deleteForm->createView(), 
     )); 
    } 

    /** 
    * Deletes a type entity. 
    * 
    * @Route("/{id}", name="type_delete") 
    * @Method("DELETE") 
    */ 
    public function deleteAction(Request $request, Type $type) 
    { 
     $form = $this->createDeleteForm($type); 
     $form->handleRequest($request); 

     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->remove($type); 
      $em->flush($type); 
     } 

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

    /** 
    * Creates a form to delete a type entity. 
    * 
    * @param Type $type The type entity 
    * 
    * @return \Symfony\Component\Form\Form The form 
    */ 
    private function createDeleteForm(Type $type) 
    { 
     return $this->createFormBuilder() 
      ->setAction($this->generateUrl('type_delete', array('id' => $type->getId()))) 
      ->setMethod('DELETE') 
      ->getForm() 
     ; 
    } 
} 

Game.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Component\Validator\Constraints as Assert; 
/** 
* Game 
* 
* @ORM\Table(name="game") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\GameRepository") 
*/ 
class Game 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Type", inversedBy="games") 
    * @ORM\JoinColumn(name="type_id", referencedColumnName="id") 
    */ 
    private $type; 



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


    /** 
    * @var string 
    * @Assert\NotBlank() 
    * @Assert\Length(
    *  min = "3", 
    * max = "100" 
    *) 
    * @ORM\Column(name="name", type="string", length=255, unique=true) 
    */ 
    private $name; 


    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * 
    * @return Game 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getType() 
    { 
     return $this->type; 
    } 

    /** 
    * @param mixed $type 
    */ 
    public function setType($type) 
    { 
     $this->type = $type; 
    } 
} 

Type.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 


/** 
* Type 
* 
* @ORM\Table(name="type") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\TypeRepository") 
*/ 
class Type 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Game", mappedBy="type") 
    */ 
    private $games; 

    public function __construct() 
    { 
     $this->games = new ArrayCollection(); 
    } 
    /** 
    * @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=255) 
    */ 
    private $name; 




    /** 
    * Get id 
    * 
    * @return int 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * Set name 
    * 
    * @param string $name 
    * 
    * @return Type 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 

     return $this; 
    } 

    /** 
    * Get name 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getGames() 
    { 
     return $this->games; 
    } 

    /** 
    * @param mixed $games 
    */ 
    public function setGames($games) 
    { 
     $this->games = $games; 
    } 

    public function addGame(Game $game) 
    { 
     $this->games->add($game); 
     $game->setType($this); 
    } 
    public function removeGame(Game $game) 
    { 
     $this->games->removeElement($game); 
    } 
} 

GameType.php

<?php 

namespace AppBundle\Form; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Bridge\Doctrine\Form\Type\EntityType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class GameType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', TextType::class, [ 
       'attr' => [ 
        'class' => 'form-control', 
       ], 
      ]); 
     $builder 
      ->add('type', EntityType::class, [ 
       'class' => 'AppBundle:Type', 
       'choice_label' => 'name', 
       'multiple' => false, 
       'expanded' => false, 
       'attr' => [ 
        'class' => 'form-control', 
       ], 

      ]); 


    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Game' 
     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'appbundle_game'; 
    } 


} 

TypeType.php

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class TypeType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('name')  ; 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Type' 
     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'appbundle_type'; 
    } 
} 

回答

0

你需要一点的工作在你的GameType.php形式:

// GameType.php 
$builder 
    ->add('type', EntityType::class, [ 
     'class' => 'AppBundle:Type', 
     'placeholder' => ' ', 
     'choice_label' => function($type){ 
      return $type->getName(); 
     }, 
     'multiple' => false, // a user can select only one option per submission 
     'expanded' => false // options will be presented in a <select> element; set this to true, to present the data as checkboxes 
    ]) 
; 

然后,在game/show.html.twig模板:

{{ game.type.name }} //supposing you want to display the name column of the types table 

提示:每次你都面临这样的麻烦时,你可以使用{{ dump(variable) }}检查里面有什么吧。

对于一个完整的ManyToOne示例检查this文章。

+0

我接受了你的回答。这是有益的,并很好地解释。 – Ducky

相关问题