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

Why is redirect resetting my object?

我在 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_dump.
中看到对 appointment 进行更改之前的原始对象 似乎更改约会的通过将其重置回其原始状态...?

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

我没有看到任何您实际保留任何内容的代码。所以你需要在更新操作中使用它

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

只改变对象而不坚持它不会改变任何东西!

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

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

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

在内部,Extbase 仅将对象的 id 传递给第二个操作,这意味着,在第二个操作中,您的对象再次从持久性中获取。如果更改在之前的操作中没有保留,它们将会丢失。

forward() 只是终止当前的 MVC 请求并启动一个新的请求而无需重新加载页面,这意味着所有会话数据和非持久化更改仍然可用第二个动作。

在这种情况下,Extbase 传递的不是 id,而是真实的对象,因此更改仍然存在。

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

  1. 使用 forward() 代替 redirect()
  2. 在调用 redirect().
  3. 之前通过 PersistenceManager 保存对数据库的更改
  4. 以某种方式保留您的对象更改(例如,不是将真实实例传递给 redirect(),而是序列化字符串,然后在您的第二个操作中将其反序列化)。