我正在尝试zend表达,这是我的config/autoload/zend-expressive.global.php
当我尝试向一个路径发出请求时会返回错误页面,但我看不到任何php apache错误日志中的错误。所以我不知道是什么问题。
在zend-express中有没有办法让那些php错误日志?对于zend表达还有什么好的文档吗?官方文档似乎没有太多的例子。
return [
'debug' => true,
'config_cache_enabled' => false,
'zend-expressive' => [
'error_handler' => [
'template_404' => 'error::404',
'template_error' => 'error::error',
],
],
];
答案 0 :(得分:4)
如果你想尝试表达我建议使用骨架安装程序。它为您提供了安装内容的选项。其中一个选项是whoops错误处理程序,它提供了很多关于异常的详细信息。
官方文档包含大量信息:https://docs.zendframework.com/zend-expressive/
安装程序文档:https://docs.zendframework.com/zend-expressive/getting-started/skeleton/
更新:添加ErrorHandler记录器示例
作为ErrorHandler的基础,您可以使用Zend\Stratigility\Middleware\ErrorHandler
。您可以将listener附加到该ErrorHandler并将其用于记录。或者,您可以复制该类并根据需要进行修改。
下一步是为它创建一个ErrorHandlerFactory:
<?php
// src/Factory/ErrorHandler/ErrorHandlerFactory.php
namespace App\Factory\ErrorHandler;
use Interop\Container\ContainerInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;
use Throwable;
use Zend\Diactoros\Response;
use Zend\Expressive\Middleware\ErrorResponseGenerator;
use Zend\Stratigility\Middleware\ErrorHandler;
class ErrorHandlerFactory
{
public function __invoke(ContainerInterface $container)
{
$generator = $container->has(ErrorResponseGenerator::class)
? $container->get(ErrorResponseGenerator::class)
: null;
$errorHandler = new ErrorHandler(new Response(), $generator);
if ($container->has(LoggerInterface::class)) {
$logger = $container->get(LoggerInterface::class);
$errorHandler->attachListener(function (
Throwable $throwable,
RequestInterface $request,
ResponseInterface $response
) use ($logger) {
$logger->error('"{method} {uri}": {message} in {file}:{line}', [
'date' => date('Y-m-d H:i:s'),
'method' => $request->getMethod(),
'uri' => (string) $request->getUri(),
'message' => $throwable->getMessage(),
'file' => $throwable->getFile(),
'line' => $throwable->getLine(),
]);
});
}
return $errorHandler;
}
}
之后你需要注册ErrorHandler。您可以将其添加到config/autoload/middleware-pipeline.global.php
,特别是middleware => always
部分。这样它就会一直运行。如果你首先注册它,它将在其他任何东西之前运行。
<?php
// in config/autoload/middleware-pipeline.global.php
use Acme\Container\ErrorHandlerFactory;
use Zend\Stratigility\Middleware\ErrorHandler;
return [
'dependencies' => [
/* ... */
'factories' => [
ErrorHandler::class => ErrorHandlerFactory::class,
/* ... */
],
/* ... */
],
'middleware_pipeline' => [
'always' => [
'middleware' => [
ErrorHandler::class,
/* ... */
],
'priority' => 10000,
],
/* ... */
],
];