gpt4 book ai didi

php - 有没有一种方法可以在未构造的类中使用CakeResponse对象?

转载 作者:行者123 更新时间:2023-12-03 08:25:18 24 4
gpt4 key购买 nike

我目前正在为 CakePHP 中的应用程序自定义 ErrorHandler
原因?好吧,机器人总是试图在您的服务器中查找内容,有时它们会引发异常和/或错误。

这个 ErrorHandler 的想法是通过处理这种类型的请求并使其对用户客户端透明(例如,因为它可能影响JavaScript)来过滤请求并使用适当的 header 进行响应,并防止进一步的请求损坏。

And what better way than to use the Framework's functionality, right?

The thing is that since this ErrorHandler is being used statically, well, there is no constructor so nothing inherits anything, it doesn't matter if you instantiate any other CakePHP Object.

What would be the appropriate way to use 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
));

应用程序/库/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 ,与直接使用header()相比没有任何优势。

话虽如此,但是无论如何您都放弃了Controller.shutdownDispatcher.afterDispatch事件。它们以ExceptionRenderer::_shutdown()调度,并且通常用于设置响应头(CORS相关头是一个很好的例子),因此您应该确定是否可以丢弃它们,甚至可能是必需的。

如果需要保留shutdownafterDispatch事件,则应该自行触发它们,或者甚至可以使用扩展的ExceptionRenderer处理该特定类型的异常,并添加位置 header 发送空响应。

也可以看看

  • Cookbook > Development > Exceptions > Using a custom renderer with Exception.renderer to handle application exceptions
  • 关于php - 有没有一种方法可以在未构造的类中使用CakeResponse对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43666201/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com