2

私は Symfony2 と Doctrine 2.1.6 で作業しており、マルチステップ フォームをセットアップしようとしています。各フォーム ページ間で、ドクトリン エンティティを $_SESSION に送信しようとします。

そのドットリンのドキュメントによると、複数ページのフォームを解決することが可能であり、その方法さえあります: http://docs.doctrine-project.org/en/2.1/cookbook/entities-in-session.html

しかし、stackoverflow に関する他の多くの投稿によると、エンティティをセッションに送信することはできません。

私は次のコントローラアクションを持っています。ここでは、教義のドキュメントをほとんどコピー/貼り付けています。

public function indexAction(Request $request, $id)
{
    $session = $request->getSession();
    $em = $this->getDoctrine()->getEntityManager();


    if (isset($_SESSION['propertyAdd'])) {   
    $property = $_SESSION['propertyAdd'];
    $property = $em->merge($property);
    }

    else {

    $property = new property;

    }

    $form = $this->createForm(new propertyType($this->getDoctrine()),$property);

    // check form
    if ($request->getMethod() == 'POST') {
            $form->bindRequest($request);
            if ($form->isValid()){

            $em->detach($property);
            $_SESSION['propertyAdd'] = $property;

            // redirection to next step here  

            }
            }
   return $this->render('AddProperty:'.$id.'.html.twig', array(
        'form' => $form->createView(),));

}

行 $_SESSION['propertyAdd'] = $property; 次のエラーを教えてください:

Fatal error: Uncaught exception 'ErrorException' with message 'Notice: Unknown: "id" returned as member variable from __sleep() but does not exist in Unknown line 0' in G:..\Symfony\vendor\symfony\src\Symfony\Component\HttpKernel\Debug\ErrorHandler.php on line 65

Symfony2 ヘルパーを使用してこの行を置き換えると

$session->set('propertyAdd', $property);

次の例外がスローされます。

Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector::serialize() must return a string or NULL

教義の例は実行可能ですか。

4

1 に答える 1

3

これはあなたの質問には答えませんが、なぜあなたは:

  • エンティティを作成する
  • シリアライズする
  • セッションに入れます(個人的には、オブジェクトを文字列に変換するのは良いことだとは思いません)
  • フォームの次のステップでセッションから取得します
  • 逆シリアル化する
  • それに新しいデータを追加します
  • シリアライズする
  • もう一度セッションに入れます

など...

フォーム データをセッションに直接保存し、フォームのすべての手順が完了した後にエンティティを作成してみませんか?

エンティティを検証するためにこれを行っている場合は、(エンティティにリンクされていない) フォームを使用して、検証制約をフォームに追加するだけです。

于 2012-06-13T09:49:40.853 に答える