2016-12-04 85 views
0

我在TYPO3 6.2中用Extbase做了一個前端擴展,而在我的控制器中重定向時,我放棄了對我的對象所做的更改。 我不知道這是否是有意的,爲什麼?爲什麼重定向我的對象?

在這裏,我看到我在var_dump中對appointment所做的更改。

/** 
* 
* @param Domain\Model\Appointment $appointment 
* @return void 
*/ 
public function bookAction(Domain\Model\Appointment $appointment) { 
    if ($appointment->getBooked()) { 
     \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($appointment); 
     $this->redirect('update', null, null, array('appointment'=>$appointment)); 
    } 
} 

然後我看到原來的對象,我在var_dumpappointment所做的更改。
似乎改變的約會的合格將其重置回原來的狀態......?

/** 
* action update 
* 
* @param Domain\Model\Appointment $appointment 
* @return void 
*/ 
public function updateAction(Domain\Model\Appointment $appointment) { 
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($appointment); 
} 
+0

似乎從你的代碼,您只需調試你的價值,並通過同一個對象中的重定向,你必須先存儲更改到你的對象, 一樣,如果你想在你的對象改變任何東西,那麼你必須使用特定屬性的settermenthod。 –

+0

但是更改已經在對象中,我沒有調試值,我正在調試整個對象,並且我可以看到它具有在調用bookAction的表單中輸入的正確值。難道TYPO3只是在重定向時從存儲庫重新加載對象,而不是將實際對象傳遞給重定向函數? –

回答

4

Extbase控制器包含兩種在當前操作中調用不同操作的方法:redirect()forward()

差異很小,但後果可能很大。

重定向()調用通過30X HTTP重定向不同的動作,所以基本上它需要恢復完整的頁面重載(和重新初始化)PHP會話,數據和對象。

內部的Extbase只傳遞一個對象的id到第二個動作,意思就是說,在第二個動作中,你的對象再次從持久中取出。如果這些變化沒有在之前的行動中持續下去,它們將會丟失。

向前()剛剛結束當前​​的MVC請求並沒有開始一個頁面重載一個新的,這意味着所有的會話數據和不peristed變化還是在第二個動作可用。

在這種情況下,Extbase不會傳遞id,而是真實的對象,所以更改仍然存在。

您可以執行下列操作之一:

  1. 使用forward()而不是redirect()
  2. 在致電redirect()之前,通過PersistenceManager堅持更改分貝。
  3. 以某種方式保留對象更改(例如,不傳遞實際實例到redirect(),但是序列化的字符串,然後在第二個操作中將其反序列化)。
+0

謝謝你,很多細節的完美答案! :)對我很有幫助! –

1

我沒有看到任何代碼,你實際上堅持什麼。因此,你需要在你的更新動作

$persistenceManager = $this->objectManager->get("TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager"); 
$persistenceManager->persistAll(); 

只是改變了對象,而堅持它不會改變任何東西!