私は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()
));
}
あなた@AlvinBunkをありがとう、それは私が「TODO」をレンダリングする必要がいけない意味をなします。私はその行を削除しました。しかし、私はまだ同じエラーが発生しています:私は – andreahg
あなたのホスト名の後に 'app_dev.php'を追加してデバッグURLを使用できますか? 'http:// localhost/app_dev.php/my_route'のように、それがもっと情報を表示するかどうか確認してください。エラーが発生しているファイルと行を探しています。 –
私はEDIT#2も追加しました。 –