2017-06-28 54 views
1

我需要一些幫助。 我有一個表單,我想選擇一個現有的實體或提交一個新的。所以我有一個班級Dolmetscher(語言翻譯),標題,姓名,語言。創建窗體我有功能的類InterpreterTypeSymfony使用原則的實體選擇

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder->add('anrede', ChoiceType::class, array(
       'choices' => array(
        'Herr' => 'Herr', 
        'Frau' => 'Frau' 
       ) 
      )) 
      ->add('vorname') 
      ->add('nachname') 
      ->add('sprache') 
      ->add('dolmetscher', EntityType::class, array(
       'class' => 'AppBundle:Dolmetscher', 
       'placeholder' => 'Dolmetscher wählen', 
       'label' => 'Dolmetscher', 
       'choice_value' => 'id', 
       'choice_label' => function ($dolmetscher) { 
        return $dolmetscher->getAnrede() . ' ' . 
          $dolmetscher->getVorname() . ' ' . 
          $dolmetscher->getNachname(); 
       }, 
       'mapped' => false, 
      )) 
      ->add('select', SubmitType::class, array(
       'label' => 'Übernehmen', 
       'attr' => array(
        'class' => 'btn btn-default', 
        'formnovalidate' => 'formnovalidate' 
       ) 
      )) 
      ->add('save', SubmitType::class, array(
       'label' => 'OK', 
       'attr' => array(
        'style' => 'float: right', 
        'class' => 'btn btn-default' 
       ) 
      )) 
      ->add('reset', SubmitType::class, array(
       'label' => 'Zurücksetzen', 
       'attr' => array(
        'style' => 'float: right; margin-right: 10px', 
        'class' => 'btn btn-warning', 
        'formnovalidate' => 'formnovalidate' 
       ) 
    )); 
} 

我也害怕與實體的選擇,這是工作,有一個新的Dolmetscher「選擇」按鈕和表單字段與「保存」按鈕。另外一個「重置」按鈕

我的控制器類看起來像

/** 
* @Route("/u01/5", name="u1_5") 
*/ 
public function dolmetscherAction(Request $request) { 
    $session = $this->get("session"); 
    var_dump($session->get("foo")); 
    if (!$session->get("dolmetscher")) { 
     $dolmetscher = new Dolmetscher(); 
    } else { 
     $dolmetscher = $session->get("dolmetscher"); 
    } 
    $dolmetscherForm = $this->createForm(DolmetscherType::class, $dolmetscher); 
    $dolmetscherForm->handleRequest($request); 

    if ($dolmetscherForm->get('select')->isClicked()) { 
     $dolmetscher = $dolmetscherForm->get('dolmetscher'); 
     $session->set("dolmetscher", $dolmetscher); 
     return $this->redirectToRoute('u1_5'); 
    } 

    if ($dolmetscherForm->get('reset')->isClicked()) { 
     $dolmetscher = new Dolmetscher(); 
     $session->set("dolmetscher", $dolmetscher); 
     return $this->redirectToRoute('u1_5'); 
    } 

    if ($dolmetscherForm->get('save')->isClicked() && $dolmetscherForm->isSubmitted() && $dolmetscherForm->isValid()) { 
     $dolmetscher = $dolmetscherForm->getData(); 
     $session->set("dolmetscher", $dolmetscher); 
     return $this->redirectToRoute('homepage'); 
    } 

    return $this->render('urkunden/u01/5.html.twig', [ 
       'form' => $dolmetscherForm->createView(), 
       'page_title' => 'U01' 
    ]); 
} 

我想把Dolmetscher從選擇到$ _set以備後用,e.g。堅持數據庫,這對於新的Dolmetscher來說工作得很好,但不適合我的選擇。我得到一個異常「封閉」的

序列化是不允許

我不知道如果我做這一切的權利(我有一些一對多的關係,並希望有一個觀點爲每個實體/形式,並堅持一切在一次結束,以便我沒有在我的數據庫中,當用戶在中途退出時只有一個Dolmetscher)

我也認爲它可能是填充窗體字段從我無法工作的選擇。有人可以幫助我,我會很感激。

回答

1

這部分代碼很可能是你的問題的由來:

if ($dolmetscherForm->get('select')->isClicked()) { 
    $dolmetscher = $dolmetscherForm->get('dolmetscher'); <------ this one 
    $session->set("dolmetscher", $dolmetscher); 
    return $this->redirectToRoute('u1_5'); 
} 

你正在試圖序列包含一個封閉的表單對象。關閉無法序列化(訪問此鏈接獲取更多見解Exception: Serialization of 'Closure' is not allowed

如果轉儲$dolmetscher變量,您可能會得到一個表單對象而不是您想要的實體。嘗試更換行:

$dolmetscher = $dolmetscherForm->get('dolmetscher'); 

有:

$dolmetscher = $dolmetscherForm->get('dolmetscher')->getData(); 
+0

非常感謝您!我認爲get()會讓你得到子對象,所以實體,但你實際上必須調用getData()。這解決了我的問題 – rav

+0

以這種方式完成這種方法是否是一種好方法,或者您有推薦的最佳做法嗎? – rav

+0

如果你不想在那裏保存實體,並將它延遲到其他控制器,你重定向你的請求,我不能看到其他解決方案,然後使用會話。 – zizoujab