0

たとえば、削除リンクが 2 回クリックされたか、別のユーザーからクリックされました。最初のクリックでオブジェクトが正しく削除されますが、deleteAction が呼び出される前に 2 回目のクリックで (古いため) 失敗します。どうすればこれを防ぐことができますか?

/**
 * 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」型でした。

アクション内で何かを行っても、前に失敗するため、役に立ちません…</p>

4

1 に答える 1

0

次のような流動的なマークアップがあると仮定します。

<f:link.action action="delete" arguments="{upload:uploadObjectToDelete}" > ... 

uploadObjectToDeleteつまり、ユーザーがこのリンクをクリックしたときに、オブジェクトを削除アクションに渡します。また、ユーザーがそのリンクをクリックすると、ExtBasePropertyMapperはリンクとともに送信された引数を使用しuploadObjectToDeleteてデータベース内でを検索し、コントローラーと削除アクションに渡します。

最初のクリック後、その削除アクションはデータベースからオブジェクトを正常に削除し、リストアクションにリダイレクトするとページが再ロードされます。ただし、今回はuploadObjectToDeleteオブジェクトはnullです。したがって、2回目のクリックでは、削除アクション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) { ...

しかし、このオプションは意味がありません。なぜユーザーがすでにnullになっているオブジェクトを削除しようとすることを許可するのですか?

これらは単なる提案です。

于 2012-08-31T17:13:06.037 に答える