我创建了一个特定于扩展名的“未找到”消息,要在showAction中显示已删除或隐藏扩展记录的情况。这很简单,但是当将HTTP状态设置为404时,问题出现了,只有在清除缓存后才能一次。每个后续呼叫的状态均为“200 OK”。
这是我的控制器动作:
public function showAction(\My\Model\Name $model = null)
{
if (is_null($model)) {
$this->response->setStatus(404);
$this->response->sendHeaders();
$this->view->assign('model', ['notFound'=> 1]);
} else {
$this->view->assign('model', $model);
}
}
通过Fluid模板中的简单条件,我可以轻松显示特定的“Record not found”文本,并隐藏记录标准详细信息视图的HTML。
有没有办法缓存控制器操作中发送的状态(和标题)?我从早期的问题中了解到,同一问题会导致$this->response->setHeaders()
。
答案 0 :(得分:0)
在控制器中使用以下功能来处理此类例外
/**
* @param \TYPO3\CMS\Extbase\Mvc\RequestInterface $request
* @param \TYPO3\CMS\Extbase\Mvc\ResponseInterface $response
* @throws \Exception|\TYPO3\CMS\Extbase\Property\Exception
*/
public function processRequest(\TYPO3\CMS\Extbase\Mvc\RequestInterface $request, \TYPO3\CMS\Extbase\Mvc\ResponseInterface $response) {
$aExceptionClasses = array(
'TYPO3\CMS\Extbase\Property\Exception\InvalidSourceException',
'TYPO3\CMS\Extbase\Mvc\Controller\Exception\RequiredArgumentMissingException',
'TYPO3\CMS\Extbase\Property\Exception\TargetNotFoundException',
'TYPO3\CMS\Core\Error\Exception'
);
try {
parent::processRequest($request, $response);
}
catch(\Exception $e) {
$previousException = $e->getPrevious();
if(in_array(get_class($previousException), $aExceptionClasses) || in_array(get_class($e), $aExceptionClasses)){
$GLOBALS['TSFE']->pageNotFoundAndExit();
}
else{
throw $e;
}
}
}