为什么重定向重置我的对象?

Col*_*ass 0 typo3 extbase typo3-6.2.x

我在TYPO3 6.2中使用Extbase进行了前端扩展,并且在我的控制器中重定向时,我失去了对我的对象所做的更改.我想知道这是否有意,为什么?

在这里,我看到我已经到了做出改变appointmentvar_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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我看到原来的对象,我要做出的改变之前appointmentvar_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);
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*kyi 6

Extbase控制器包含两种在当前操作中调用不同操作的方法:redirect()forward().

差异很小,但后果可能很大.

redirect()通过30x HTTP重定向调用不同的操作,因此基本上它需要完整的页面重新加载,还原(并重新初始化)PHP会话,数据和对象.

内部Extbase只将一个对象传递id给第二个动作,这意味着,在第二个动作中,您的对象将再次从持久性中获取.如果在之前的行动中没有持续改变,那么它们将会丢失.

forward()只是终止当前的MVC请求并在没有页面重新加载的情况下启动新的请求,这意味着所有会话数据和非持久更改在第二个操作中仍然可用.

在这种情况下,Extbase不会传递id真实对象,因此更改仍然存在.

您可以执行以下操作之一:

  1. forward()而不是redirect().
  2. PersistenceManager在调用之前保持对db的更改redirect().
  3. 以某种方式保留您的对象更改(例如,不传递真实实例redirect(),但序列化字符串,然后在第二个操作中将其反序列化).