2016-12-04 2 views
0

Я сделал расширение интерфейса с Extbase в TYPO3 6.2 и при перенаправлении в своем контроллере я теряю изменения, которые я сделал для своего объекта. Интересно, если это предназначено и почему?Зачем перенаправлять мой объект?

Здесь я вижу изменение, которое я сделал для appointment в var_dump.

/** 
* 
* @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)); 
    } 
} 

Затем я вижу исходный объект, прежде чем изменения, которые я сделал, чтобы appointment в var_dump.
Кажется, что передача измененного назначения сбрасывает его обратно в исходное состояние ...?

/** 
* 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

кажется, что из вашего кода, который вы только отладить ваше значение и передать тот же объект в редиректа, вы должны сначала сохраняются изменения в свой объект, Например, если вы хотите что-либо изменить в вашем объекте, то у вас есть использовать setter menthod определенного свойства. –

+0

, но изменения уже находятся в объекте, я не отлаживаю значение, я отлаживаю весь объект, и я вижу, что он имеет правильные значения, введенные в форму, которая вызывает bookAction.Может ли быть так, что TYPO3 просто перезагружает объект из репозитория при перенаправлении вместо передачи фактического объекта функции переадресации? –

ответ

4

Контроллеры Extbase содержат два способа вызова различных действий в рамках текущего действия: redirect() и forward().

Разница крошечная, но последствия могут быть огромными.

redirect() вызывает другое действие через перенаправление HTTP 30x, поэтому в основном это требует полной перезагрузки страницы с восстановлением (и повторной инициализацией) сеанса, данных и объектов PHP.

Внутренне Extbase передает только объект id второму действию, а это означает, что в этом втором действии ваш объект снова извлекается из сохранения. И если изменения не были сохранены в предыдущем действии, они будут потеряны.

forward() просто прекращает текущий запрос MVC и запускает новый без перезагрузки страницы, что означает, что все данные сеанса и изменения без изменений все еще доступны во втором действии.

В этом случае Extbase передает не id, а реальный объект, поэтому изменения все еще существуют.

Вы можете выполнить одно из следующих действий:

  1. Использование forward() вместо redirect().
  2. Persist переходит на db через PersistenceManager перед вызовом redirect().
  3. Сохраняйте свой объект как-то (например, передайте не реальный экземпляр redirect(), а сериализованную строку, а затем несериализуйте его во втором действии).
+0

спасибо, отличный ответ со многими подробностями! :) Очень полезно для меня! –

1

Я не вижу никакого кода, где вы на самом деле сохраняете что-либо. Поэтому вам необходимо, чтобы в вашем обновлении действие

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

Простое изменение объекта без его сохранения ничем не изменится!

Смежные вопросы