В расширении Extbase может возникнуть необходимость информировать пользователя об ошибке или исключении.
В моем случае я должен проанализировать некоторые данные из потенциально плохого источника. Таким образом, расширение должно проверять эти данные. И если данные недействительны, они должны выдать исключение, которое затем может быть обработано TYPO3.
Однако я могу только найти информацию о том, как работают исключения и обработчики ошибок, но нет информации о том, как правильно генерировать исключение изнутри расширения.
Так, каков предполагаемый способ вызвать исключение из расширения Extbase?
Если я выдаю синтаксическую ошибку, TYPO3 отображает сообщение, подобное этому:
(Взято из ссылка на основной API.)
Это то, что я ожидал правильно выдается ошибка или исключение, чтобы выглядеть.
Изменить: я пытался выдать ошибку, как это:
throw new \Exception('Invalid data');
Тем не менее, все внешние интерфейсы
К сожалению, произошла ошибка! Код: 20160721101726b5339896
Другой возможный способ вызвать ошибку:
$GLOBALS['TSFE']->pageNotFoundAndExit('Invalid data');
Однако вместо ожидаемого исключения отображается ошибка «Страница не найдена».
namespace VendorName\ExtensionName\Controller;
abstract class ActionController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* @var string
*/
protected $entityNotFoundMessage = 'The requested entity could not be found.';
/**
* @var string
*/
protected $unknownErrorMessage = 'An unknown error occurred. The wild monkey horde in our basement will try to fix this as soon as possible.';
/**
* @param \TYPO3\CMS\Extbase\Mvc\RequestInterface $request
* @param \TYPO3\CMS\Extbase\Mvc\ResponseInterface $response
* @return void
* @throws \Exception
* @override \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
*/
public function processRequest(\TYPO3\CMS\Extbase\Mvc\RequestInterface $request, \TYPO3\CMS\Extbase\Mvc\ResponseInterface $response) {
try {
parent::processRequest($request, $response);
}
catch(\Exception $exception) {
// If the property mapper did throw a \TYPO3\CMS\Extbase\Property\Exception, because it was unable to find the requested entity, call the page-not-found handler.
$previousException = $exception->getPrevious();
if (($exception instanceof \TYPO3\CMS\Extbase\Property\Exception) && (($previousException instanceof \TYPO3\CMS\Extbase\Property\Exception\TargetNotFoundException) || ($previousException instanceof \TYPO3\CMS\Extbase\Property\Exception\InvalidSourceException))) {
$GLOBALS['TSFE']->pageNotFoundAndExit($this->entityNotFoundMessage);
}
throw $exception;
}
}
/**
* @return void
* @override \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
*/
protected function callActionMethod() {
try {
parent::callActionMethod();
}
catch(\Exception $exception) {
// This enables you to trigger the call of TYPO3s page-not-found handler by throwing \TYPO3\CMS\Core\Error\Http\PageNotFoundException
if ($exception instanceof \TYPO3\CMS\Core\Error\Http\PageNotFoundException) {
$GLOBALS['TSFE']->pageNotFoundAndExit($this->entityNotFoundMessage);
}
// $GLOBALS['TSFE']->pageNotFoundAndExit has not been called, so the exception is of unknown type.
\VendorName\ExtensionName\Logger\ExceptionLogger::log($exception, $this->request->getControllerExtensionKey(), \VendorName\ExtensionName\Logger\ExceptionLogger::SEVERITY_FATAL_ERROR);
// If the plugin is configured to do so, we call the page-unavailable handler.
if (isset($this->settings['usePageUnavailableHandler']) && $this->settings['usePageUnavailableHandler']) {
$GLOBALS['TSFE']->pageUnavailableAndExit($this->unknownErrorMessage, 'HTTP/1.1 500 Internal Server Error');
}
// Else we append the error message to the response. This causes the error message to be displayed inside the normal page layout. WARNING: the plugins output may gets cached.
if ($this->response instanceof \TYPO3\CMS\Extbase\Mvc\Web\Response) {
$this->response->setStatus(500);
}
$this->response->appendContent($this->unknownErrorMessage);
}
}
}
Вот статья, которая объясняет это.
Однако, как и большинство статей о программировании на TYPO3, на немецком языке 😉
Других решений пока нет …