例如,点击了删除链接两次或来自不同用户。虽然第一次单击将正确删除我的对象,但第二次单击将在我的deleteAction被调用之前失败(因为它已过时)。我该如何防止这种情况?
/**
* action delete
*
* @param $upload
* @dontvalidate $upload
* @return void
*/
public function deleteAction(Tx_MyExt_Domain_Model_Upload $upload) {
$this->uploadRepository->remove($upload);
$this->flashMessageContainer->add('Your Upload was removed.');
$this->redirect('list');
}
我得到一个例外:
值必须是“Tx_MyExt_Domain_Model_Download”类型,但类型为“NULL”。
在动作中做一些事情没有用,因为它在......之前失败了。
答案 0 :(得分:0)
我假设你有一些看起来像这样的流畅标记:
<f:link.action action="delete" arguments="{upload:uploadObjectToDelete}" > ...
其中说:当用户点击此链接时,将uploadObjectToDelete
对象传递给删除操作。当用户点击该链接时,ExtBase PropertyMapper
使用随链接发送的参数来定位数据库中的uploadObjectToDelete
,以将其传递给控制器并执行删除操作。
第一次单击后,该删除操作会成功从数据库中删除该对象,并在重定向到列表操作时重新加载该页面。但是,这次uploadObjectToDelete
对象为空。因此,对于第二次单击,当PropertyMapper
尝试为删除操作找到upload
参数时,没有要查找的对象。由于upload
参数是必需的(即不能是null
),因此会出现异常。
选项1
更改您的列表操作,以便在uploadObjectToDelete
对象为null
时不显示这些链接。这可能是最好的选择。
<f:if condition="uploadObjectToDelete">
<f:link.action action="delete" arguments="{upload:uploadObjectToDelete}" > ...
</f:if>
选项2
将删除操作更改为接受null
参数:
public function deleteAction(Tx_MyExt_Domain_Model_Upload $upload = null) { ...
但这个选项没有意义。为什么允许用户尝试删除已经为空的对象?
这些只是建议。