2013-07-13 24 views
1

我很不解.. 我正在Symfony2.3。通過控制器傳遞對象中的Symfony2

我有一個控制器,如果表單提交轉發到一個單獨的控制器。

if ($form->isValid()) { 
     $response = $this->forward('MusicMBundle:Song:addTrackToSong', array(
      'Track'=>$Track, 
      )); 
     return $response; 
    } 

然而,如可以看到的,軌道參數通過該前進到以下(簡化的)控制器通過,以另一種形式。

public function addTrackToSongAction(Request $request, $Track){ 
      if ($form->isValid()) { 
       //LOGIC 
       return $this->redirect($this->generateUrl('MusicMBundle_homepage')); 
      } 
      return $this->render('MusicMBundle:Song:addtracktosong.html.twig', array(
       'Track' => $Track, 'form' => $form->createView(), 
     )); 

如果我var_dump($軌道)函數中的任何地方,它的存在和正是我想要它。

然而,當第二表單提交,Symfony2中引發以下錯誤:

Controller "Music\MBundle\Controller\SongController::addTrackToSongAction()" requires 
that you provide a value for the "$Track" argument (because there is no default value 
or because there is a non optional argument after this one). 

坦率地說我很不解。我可以使用我需要的所有東西,但symfony對我很生氣。這個問題可能出現在我的轉發策略中?

這是我的路由文件,如果這個問題可能是存在:

MusicMBundle_Song_addTrackToSong: 
pattern: /addTrackToSong 
defaults: { _controller: MusicMBundle:Song:addTrackToSong } 
requirements: 
    _method: GET|POST 

我與框架初學者,我只是不知道從哪裏開始,不能找着什麼。

如果我可以提供任何其他信息讓我知道。

非常感謝!

+0

你嘗試刪除請求參數和使用'$這個 - > Request()方法,而不是' –

+0

無論你是指向錯誤的路線(轉發路線)或$軌道應該可以爲空公共功能addTrackToSongAction(請求$請求,$軌道= null)'但我投了第一個。 –

回答

1

您的路線可能是不正確的,因爲它沒有參數。您可以嘗試增加對軌道參數在你的路線,從這個不斷變化的圖案在你的路由文件:

pattern: /addTrackToSong 

這樣:

pattern: /addTrackToSong/{Track} 

如果您訪問的網址/addTrackToSong/yourTrackValue,$跟蹤SongController :: addTrackToSongAction方法將等於yourTrackValue

另一種方式來解決這個問題,將是你的操作方法設置$軌道的默認值。

public function addTrackToSongAction(Request $request, $Track = null) { 
+0

感謝您的回覆。所以我嘗試了使用參數進行路由,但是Track實際上是一個對象,以大約10個值的數組形式傳遞。當我添加null參數時,null傳遞通過,而不是傳遞給它自身的軌道。我想我會嘗試使用track id,然後從下一頁的實體管理器中獲取它。效率不高,但我仍然感到困惑。不過謝謝你! – user2580051

+0

軌道對象是一個實體嗎?在這種情況下,只需將Track實體的ID作爲參數傳遞,然後在需要時使用該ID再次加載整個對象。 – UrGuardian4ngel

+0

完美!在我更新我的帖子之前,你回覆了。聽起來這應該是一個很好的計劃。謝謝! – user2580051

-1

一個簡單和容易的解決方案是序列化和反序列化(現場測試)。它實際上將任何對象(也包括數組)轉換爲字符串並返回,因此可以在URL中使用它。

編碼對象的字符串:

$track_object_as_string = urlencode(base64_encode(gzcompress(serialize($Track)))); 

解碼字符串轉換成一個對象:

$Track = urldecode(unserialize(gzuncompress(base64_decode($track_object_as_string))); 
+0

這只是無用的,因爲URL有長度限制,從來沒有使用過。 – Croll

+0

我不同意,如果你有足夠短的物體。 URL長度可以是2000個字符,這對於一個相當長的壓縮對象來說足夠好。 但我不會鼓勵它,它被認爲更像是一種黑客而不是一種良好的做法。 – lovro

相關問題