为什么重定向重置我的对象?
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
,而是真实的对象,因此更改仍然存在。
您可以执行以下操作之一:
- 使用
forward()
代替 redirect()
。
- 在调用
redirect()
. 之前通过 PersistenceManager
保存对数据库的更改
- 以某种方式保留您的对象更改(例如,不是将真实实例传递给
redirect()
,而是序列化字符串,然后在您的第二个操作中将其反序列化)。
我在 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
,而是真实的对象,因此更改仍然存在。
您可以执行以下操作之一:
- 使用
forward()
代替redirect()
。 - 在调用
redirect()
. 之前通过 - 以某种方式保留您的对象更改(例如,不是将真实实例传递给
redirect()
,而是序列化字符串,然后在您的第二个操作中将其反序列化)。
PersistenceManager
保存对数据库的更改