2017-04-13 26 views
0

私はsymfonyの初心者です。データトランスフォーマーを実装しようとしています。私はドキュメンテーションに続き、ここに掲載されたさまざまなソリューションを見ました。しかし、私は自分のコードに何が間違っているのか分かっていません。symfonyオブジェクトを文字列に変換できませんでした

私はこのエラーを取得しています:

キャッチできる致命的なエラー:オブジェクトクラスのAppBundle \エンティティ\藤堂は、誰かが解決策で別のポストを知っていれば、教えてください文字列

に変換することができませんでした私はどこでそれを探すことができるか知っています。

ありがとうございます。

これは私のエンティティです。藤堂クラス

<?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 

Userクラス:Userクラスで

<?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; 

} 

は、私はゲッター/セッター

マイ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

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

あなたの小枝テンプレートに$todoオブジェクトを渡すためにしようとしているので。あなたはそれをすることはできません。あなたは何が必要ですか?あなただけの藤堂名を必要とし、あなたがゲッター/セッターを作成している場合は、代わりに次のように行うことができます:

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

うまくいけば、理にかなっています。


EDIT#2コメントに基づいています。

また、このラインはあなたのコントローラで間違っている:

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

は、このようにする必要があります:

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

あなた@AlvinBunkをありがとう、それは私が「TODO」をレンダリングする必要がいけない意味をなします。私はその行を削除しました。しかし、私はまだ同じエラーが発生しています:私は – andreahg

+0

あなたのホスト名の後に 'app_dev.php'を追加してデバッグURLを使用できますか? 'http:// localhost/app_dev.php/my_route'のように、それがもっと情報を表示するかどうか確認してください。エラーが発生しているファイルと行を探しています。 –

+0

私はEDIT#2も追加しました。 –

関連する問題