我知道这些问题并不受欢迎,但我试图询问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团队成员告诉我不要这样做的开始。
问题:
ErrorHandlerMiddleware
和a之间的关系是什么?
定制错误处理程序ErrorHandlerMiddleware
会发生什么,但它还会注册自定义错误处理程序?哪个捕获了什么(例如中间件异常与控制器异常)?