Есть ли способ использования CakeResponse Object в неструктурированном классе?

Я сейчас делаю кастом ErrorHandler для приложения в CakePHP.
Причина? Ну, боты всегда пытаются найти что-то на ваших серверах, и иногда они вызывают исключения или ошибки.

Идея с этим ErrorHandler состоит в том, чтобы фильтровать запросы и отвечать с соответствующими заголовками и предотвращать дальнейшее повреждение запроса, обрабатывая этот тип запросов и делая его прозрачным для пользователя-клиента (потому что это может повлиять на JavaScript, например).


И что может быть лучше, чем использовать функциональность Framework, верно?

Дело в том, что поскольку этот ErrorHandler используется статически,
ну, нет конструктора, так что ничто не наследует ничего, это не
важно, если вы создаете какие-либо другие CakePHP Object.

Каков был бы подходящий способ использовать CakeResponse Object?


Конфигурация CakePHP:

приложение / 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.

0

Решение

Там нет никакого смысла в использовании CakeResponse возражать там … это будет работать, если вы позвоните send() на этом, однако, с только этим одним заголовком, нет никакого преимущества по сравнению с использованием header() непосредственно.

При этом, однако, вы в любом случае бросаете Controller.shutdown а также Dispatcher.afterDispatch События. Они отправляются в ExceptionRenderer::_shutdown()и часто используются для установки заголовков ответа (хороший пример относится к заголовкам, связанным с CORS), поэтому вам следует выяснить, можно ли их удалить, или, возможно, даже требуется.

Если вам нужно сохранить shutdown а также afterDispatch события, то вы должны либо запустить их самостоятельно, или, возможно, даже использовать расширенный ExceptionRenderer который обрабатывает этот конкретный тип исключения и отправляет пустой ответ с добавленным заголовком вашего местоположения.

Смотрите также

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector