【问题标题】:Slim 4 catching php warnings, notices & errorsSlim 4 捕捉 php 警告、通知和错误
【发布时间】:2021-07-14 01:29:38
【问题描述】:

我刚开始使用 slim 框架,想使用自定义错误处理程序捕获 php 警告、通知和错误。

ErrorHandlerMiddleware.php

<?php

namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

final class ErrorHandlerMiddleware implements MiddlewareInterface {

    var $errtext;

    public function __construct() {}

    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
        
        $errorTypes = E_ALL;
        set_error_handler(function ($errno, $errstr, $errfile, $errline) {

            $this->errtext = $errno;
            switch ($errno) {
                
                case E_USER_ERROR:
                    
                    //do something
                    break;

                case E_USER_WARNING:
                    
                    //do something
                    break;

                default:

                    //do something
                    break;

            }
            return true;

        }, $errorTypes );
        
        $request = $request->withAttribute('error',  $this->errtext);
        return $handler->handle($request);

    }
}

index.php

<?php 

    use Psr\Http\Message\ResponseInterface as Response;
    use Psr\Http\Message\ServerRequestInterface as Request;
    use Slim\Factory\AppFactory;
    use App\Middleware\ErrorHandlerMiddleware;
    
    require_once("vendor/autoload.php");

    $app = AppFactory::create();
    $app->setBasePath("/data");
    $app->addRoutingMiddleware();
    
    $app->get('/', function (Request $request, Response $response) {
        $response->getBody()->write('<a href="hello/world">Try /hello/world</a>');
        return $response;
    });

    $app->add(ErrorHandlerMiddleware::class);
    $errorMiddleware = $app->addErrorMiddleware(true, true, true);
    $app->run();

自定义错误处理程序正在工作(不再显示 php 警告)。但我想在错误处理程序修改的输出中添加一些自定义变量。这应该由

$request = $request->withAttribute('error',  $this->errtext);
$request->getAttribute('error'); 

但错误属性为空。

【问题讨论】:

    标签: php slim slim-4


    【解决方案1】:

    编辑:当你定义一个回调函数时,那么$this不在同一个范围内。此外,当发生错误时,中间件实例本身也不会“恢复”。另一种方法是抛出一个自定义异常以在另一个中间件中捕获并呈现它。

    【讨论】:

    • 值仍然是 null 错误处理程序是否可能在请求完成后运行,所以我需要在不同的位置分配值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多