Я сейчас делаю кастом ErrorHandler для приложения в CakePHP.
Причина? Ну, боты всегда пытаются найти что-то на ваших серверах, и иногда они вызывают исключения или ошибки.
Идея с этим ErrorHandler состоит в том, чтобы фильтровать запросы и отвечать с соответствующими заголовками и предотвращать дальнейшее повреждение запроса, обрабатывая этот тип запросов и делая его прозрачным для пользователя-клиента (потому что это может повлиять на JavaScript, например).
И что может быть лучше, чем использовать функциональность Framework, верно?
Дело в том, что поскольку этот ErrorHandler используется статически,
ну, нет конструктора, так что ничто не наследует ничего, это не
важно, если вы создаете какие-либо другие CakePHP Object.Каков был бы подходящий способ использовать CakeResponse Object?
приложение / Config / bootstrap.php:
App::uses('CustomErrorHandler', 'Lib');
приложение / Config / core.php:
// Error and exception handlers.
Configure::write('Error', array(
'handler' => 'CustomErrorHandler::handleError',
'level' => E_ALL & ~E_DEPRECATED,
'trace' => true
));
Configure::write('Exception', array(
'handler' => 'CustomErrorHandler::handleException',
'renderer' => 'ExceptionRenderer',
'log' => true
));
приложение / Lib / CustomErrorHandler.php:
... rest of class code ...
/**
* Named after convention: This method receives all CakePHP's
* errors and exceptions…
*
* @param array $e The exception object.
* @return mixed Returns the error handling or header redirection.
*/
public static function handleException($e)
{
$message = (string) $e->getMessage();
$code = (int) $e->getCode();
$file = (string) $e->getFile();
$line = (string) $e->getLine();
// If it's a Blacklist resource exception it will log it and redirect to home.
if (self::__isResourceException($message))
{
return self::__dismissError();
}
return parent::handleException($e);
}
/**
* This method redirects to home address using CakeResponse Object.
*
* @return mixed
*/
private static function __dismissError()
{
return (new CakeResponse)->header(array(
'Location' => self::$redirectUrl
));
}
}
ОБНОВЛЕНИЕ 2:
Попробую небольшой слой поверх ExceptionRenderer.
Там нет никакого смысла в использовании CakeResponse
возражать там … это будет работать, если вы позвоните send()
на этом, однако, с только этим одним заголовком, нет никакого преимущества по сравнению с использованием header()
непосредственно.
При этом, однако, вы в любом случае бросаете Controller.shutdown
а также Dispatcher.afterDispatch
События. Они отправляются в ExceptionRenderer::_shutdown()
и часто используются для установки заголовков ответа (хороший пример относится к заголовкам, связанным с CORS), поэтому вам следует выяснить, можно ли их удалить, или, возможно, даже требуется.
Если вам нужно сохранить shutdown
а также afterDispatch
события, то вы должны либо запустить их самостоятельно, или, возможно, даже использовать расширенный ExceptionRenderer
который обрабатывает этот конкретный тип исключения и отправляет пустой ответ с добавленным заголовком вашего местоположения.
Смотрите также
Других решений пока нет …