错误处理程序和CakePHP中的ErrorHandlerMiddleware有什么区别?

时间:2017-10-26 19:22:55

标签: php cakephp cakephp-3.0

我知道这些问题并不受欢迎,但我试图询问CakePHP松弛并没有得到回应。我想将Crud CakePHP插件添加到我的项目中。为了处理错误,插件可能会使用自定义错误处理程序:

//Crud ErrorHandler registration - simplified
(new ErrorHandler($exceptionRenderer))->register();

然而,错误处理程序仅根据以下检查进行注册:

$appClass = Configure::read('App.namespace') . '\Application';

// If `App\Application` class exists it means Cake 3.3's PSR7 middleware
// implementation is used and it's too late to register new error handler.
if (!class_exists($appClass, false)) {
    $this->registerExceptionHandler();
}

当被问及此检查背后的原因时,Crud github回购会员告诉我:

  

这是因为无法从ApiListener访问中间件队列以设置自定义异常渲染器。 [...]您不应该自己注册错误处理程序。错误处理程序中间件处理它。这样做肯定会有问题。

现在我无法弄清楚错误处理程序与ErrorHandlerMiddleware之间的关系。关于中间件docs state以下内容:

  

Cake \ Error \ Middleware \ ErrorHandlerMiddleware从包装的中间件中捕获异常并使用Error & Exception Handling异常处理程序呈现错误页面

此描述的第一部分似乎暗示ErrorHandlerMiddleware仅从其他中间件捕获异常。据我所知,整个应用程序都是由他们包装的。该描述的第二部分指出中间件使用异常处理程序来显示错误。但是,通过查看中间件的source,我看不到对错误处理程序的引用,而是异常呈现器,这是其他内容。唯一的错误处理似乎是一个简单的try / catch语句,它使用渲染器渲染异常。这似乎是文档中的错误,因为实际上没有使用处理程序实例。

最后,上面的中间件描述指向一个doc页面,其中声明:

  

您可以使用任何回调类型创建错误处理程序。例如,您可以使用名为AppError的类来处理错误。通过扩展BaseErrorHandler,您可以提供用于处理错误的自定义逻辑。一个例子是:

// In config/bootstrap.php
use App\Error\AppError;
$errorHandler = new AppError(); 
$errorHandler->register();

但这让我回到了Crud github团队成员告诉我不要这样做的开始。

问题:

  1. ErrorHandlerMiddleware和a之间的关系是什么? 定制错误处理程序
  2. 如果我注册多个错误处理程序会发生什么 - 他们会覆盖吗?
  3. 如果我的应用使用ErrorHandlerMiddleware会发生什么,但它还会注册自定义错误处理程序?哪个捕获了什么(例如中间件异常与控制器异常)?

0 个答案:

没有答案