mezzio - Zendexpressive-php错误报告

标签 mezzio

我正在尝试 zend expressive,这是我的 config/autoload/zend-expressive.global.php ,当我尝试向将转到操作类的路径发出请求时它返回了错误页面,但我在 apache 错误日志中看不到任何 php 错误。所以我无法判断问题出在哪里。

zend-expressive 有没有办法获得这些 php 错误日志?还有 zendexpressive 有什么好的文档吗?官方文档好像并没有太多例子。

return [
    'debug' => true,    
    'config_cache_enabled' => false,
    'zend-expressive' => [
        'error_handler' => [
            'template_404'   => 'error::404',
            'template_error' => 'error::error',
        ],
    ],
];

最佳答案

如果你想尝试表现力,我建议使用骨架安装程序。它为您提供了安装内容的选项。其中一个选项是 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 => all 部分)来实现此目的。这样它就会一直运行。如果您将其注册为第一个,它将先于其他任何程序运行。

<?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,
        ],
        /* ... */
    ],
];

关于mezzio - Zendexpressive-php错误报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42565099/

相关文章:

laravel - '包 zendframework/zend-diactoros 被放弃,你应该避免使用它。使用 laminas/laminas-diactoros 代替。

php - 来自 PHP/Apache2 的响应中缺少 CORS header

php - 如何在 View 中获取匹配的路线名称 - Zend Expressive

php - 响应对象上的 PSR-7 "attributes"

php - Zend Expressive 中的 FastRoute 组

mongodb - Doctrine ODM - 浮点字段不适用于小数字段

template-engine - Zend 表现力 : how to change layout using Zend View